示例#1
0
    def testTestPayloadBuildSetCorrectly(self):
        """Test that test payload build is passed correctly to PaygenBuild."""
        stage = self.ConstructStage()
        self.PatchObject(paygen_build_lib, 'ScheduleAutotestTests')

        # Call the method under test.
        stage._RunPaygenInProcess('foo',
                                  'foo-board',
                                  'foo-version',
                                  True,
                                  False,
                                  False,
                                  skip_duts_check=False)

        # Ensure arguments are properly converted and passed along.
        build = gspaths.Build(version='foo-version',
                              board='foo-board',
                              channel='foo-channel',
                              bucket=gspaths.ChromeosReleases.BUCKET)
        test_payload_build = gspaths.Build(build)
        test_payload_build.bucket = gspaths.ChromeosReleases.TEST_BUCKET

        self.paygenBuildMock.assert_called_with(
            build,
            test_payload_build,
            work_dir=mock.ANY,
            site_config=stage._run.site_config,
            dry_run=True,
            skip_delta_payloads=False,
            skip_duts_check=False)
  def setUp(self):
    # Shared attributes (signed + unsigned images).
    self.bucket = 'crt'
    self.channel = 'foo-channel'
    self.board = 'board-name'
    self.version = '1.2.3'
    self.build = gspaths.Build(bucket=self.bucket, channel=self.channel,
                               board=self.board, version=self.version)
    self.release_build = gspaths.Build(bucket=self._CHROMEOS_RELEASES_BUCKET,
                                       channel=self.channel, board=self.board,
                                       version=self.version)

    # Attributes for DLC.
    self.dlc_id = 'dummy-dlc'
    self.dlc_package = 'dummy-package'

    # Signed image attributes.
    self.key = 'mp-v3'
    self.signed_image_type = 'base'

    # Unsigned (test) image attributes.
    self.milestone = 'R12'
    self.unsigned_image_type = 'test'

    # Attributes used for payload testing.
    self.src_version = '1.1.1'
    self.random_str = '1234567890'
    self.src_build = gspaths.Build(bucket=self.bucket, channel=self.channel,
                                   board=self.board, version=self.src_version)

    # Dictionaries for populating templates.
    self.image_attrs = dict(
        bucket=self.bucket,
        channel=self.channel,
        image_channel=self.channel,
        board=self.board,
        version=self.version,
        image_version=self.version,
        key=self.key,
        signed_image_type=self.signed_image_type)
    self.unsigned_image_archive_attrs = dict(
        bucket=self.bucket,
        channel=self.channel,
        image_channel=self.channel,
        board=self.board,
        version=self.version,
        image_version=self.version,
        milestone=self.milestone,
        unsigned_image_type=self.unsigned_image_type)
    self.all_attrs = dict(self.image_attrs,
                          src_version=self.src_version,
                          random_str=self.random_str,
                          **self.unsigned_image_archive_attrs)
    def testRunPaygenInProcessComplex(self):
        """Test that _RunPaygenInProcess with arguments that are more unusual."""
        with patch(paygen_build_lib, 'CreatePayloads') as create_payloads:
            # Call the method under test.
            # Use release tools channel naming, and a board name including a variant.
            stage = self.ConstructStage()
            stage._RunPaygenInProcess('foo-channel',
                                      'foo-board-variant',
                                      'foo-version',
                                      True,
                                      True,
                                      True,
                                      skip_duts_check=False)

            # Ensure arguments are properly converted and passed along.
            create_payloads.assert_called_with(
                gspaths.Build(version='foo-version',
                              board='foo-board-variant',
                              channel='foo-channel'),
                dry_run=True,
                work_dir=mock.ANY,
                site_config=stage._run.site_config,
                run_parallel=True,
                skip_delta_payloads=True,
                disable_tests=True,
                skip_duts_check=False)
    def testRunPaygenInProcess(self):
        """Test that _RunPaygenInProcess works in the simple case."""
        with patch(paygen_build_lib, 'CreatePayloads') as create_payloads:
            # Call the method under test.
            stage = self.ConstructStage()
            stage._RunPaygenInProcess('foo',
                                      'foo-board',
                                      'foo-version',
                                      False,
                                      False,
                                      False,
                                      skip_duts_check=False)

            # Ensure arguments are properly converted and passed along.
            create_payloads.assert_called_with(
                gspaths.Build(version='foo-version',
                              board='foo-board',
                              channel='foo-channel'),
                work_dir=mock.ANY,
                site_config=stage._run.site_config,
                dry_run=False,
                run_parallel=True,
                skip_delta_payloads=False,
                disable_tests=False,
                skip_duts_check=False)
示例#5
0
    def testRunPaygenInProcessComplex(self):
        """Test that _RunPaygenInProcess with arguments that are more unusual."""
        # Call the method under test.
        # Use release tools channel naming, and a board name including a variant.
        stage = self.ConstructStage()
        stage._RunPaygenInProcess('foo-channel',
                                  'foo-board-variant',
                                  'foo-version',
                                  True,
                                  True,
                                  True,
                                  skip_duts_check=False)

        # Ensure arguments are properly converted and passed along.
        self.paygenBuildMock.assert_called_with(
            gspaths.Build(version='foo-version',
                          board='foo-board-variant',
                          channel='foo-channel',
                          bucket=gspaths.ChromeosReleases.BUCKET),
            mock.ANY,
            dry_run=True,
            work_dir=mock.ANY,
            site_config=stage._run.site_config,
            skip_delta_payloads=True,
            skip_duts_check=False)
    def testRunPaygenInProcess(self):
        """Test that _RunPaygenInProcess works in the simple case."""
        # Have to patch and verify that the PaygenTestStage is created.
        stage = self.ConstructStage()

        with patch(paygen_build_lib, 'ScheduleAutotestTests') as sched_tests:
            # Call the method under test.
            stage._RunPaygenInProcess('foo',
                                      'foo-board',
                                      'foo-version',
                                      True,
                                      False,
                                      False,
                                      skip_duts_check=False)
            # Ensure that PaygenTestStage is created and schedules the test suite
            # with the correct arguments.
            sched_tests.assert_called_once_with('foo-suite-name',
                                                'foo-archive-board',
                                                None,
                                                'foo-archive-build',
                                                False,
                                                True,
                                                job_keyvals=mock.ANY)

        # Ensure arguments are properly converted and passed along.
        self.paygenBuildMock.assert_called_with(
            gspaths.Build(version='foo-version',
                          board='foo-board',
                          channel='foo-channel'),
            work_dir=mock.ANY,
            site_config=stage._run.site_config,
            dry_run=True,
            skip_delta_payloads=False,
            skip_duts_check=False)
示例#7
0
    def testWorkDir(self):
        """Test that the work_dir is generated/passed correctly."""
        client = self.createStandardClient()
        self.assertIsNotNone(client._work_dir)

        client = signer_payloads_client.SignerPayloadsClientGoogleStorage(
            build=gspaths.Build(), work_dir='/foo-dir')
        self.assertEqual(client._work_dir, '/foo-dir')
示例#8
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),
        ])
示例#9
0
 def setUp(self):
     # This is in the real production chromeos-releases, but the listed
     # build has never, and will never exist.
     self.client = signer_payloads_client.SignerPayloadsClientGoogleStorage(
         gspaths.Build(channel='test-channel',
                       board='crostools-client',
                       version='Rxx-Ryy',
                       bucket='chromeos-releases'),
         work_dir=self.tempdir)
示例#10
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)
示例#11
0
    def _RunPaygenInProcess(self,
                            channel,
                            board,
                            version,
                            debug,
                            disable_tests,
                            skip_delta_payloads,
                            skip_duts_check=False):
        """Helper for PaygenStage that invokes payload generation.

    This method is intended to be safe to invoke inside a process.

    Args:
      channel: Channel of payloads to generate ('stable', 'beta', etc)
      board: Board of payloads to generate ('x86-mario', 'x86-alex-he', etc)
      version: Version of payloads to generate.
      debug: Flag telling if this is a real run, or a test run.
      disable_tests: Do not generate test artifacts are run payload tests.
      skip_delta_payloads: Skip generating delta payloads.
      skip_duts_check: Do not check minimum available DUTs
    """
        # Convert to release tools naming for channels.
        if not channel.endswith('-channel'):
            channel += '-channel'

        with osutils.TempDir(sudo_rm=True) as tempdir:
            # Create the definition of the build to generate payloads for.
            build = gspaths.Build(channel=channel,
                                  board=board,
                                  version=version)

            try:
                # Generate the payloads.
                self._PrintLoudly('Starting %s, %s, %s' %
                                  (channel, version, board))
                paygen_build_lib.CreatePayloads(
                    build,
                    work_dir=tempdir,
                    site_config=self._run.site_config,
                    dry_run=debug,
                    run_parallel=True,
                    skip_delta_payloads=skip_delta_payloads,
                    disable_tests=disable_tests,
                    skip_duts_check=skip_duts_check)
            except (paygen_build_lib.BuildFinished,
                    paygen_build_lib.BuildLocked) as e:
                # These errors are normal if it's possible that another builder is, or
                # has processed the same build. (perhaps by a trybot generating payloads
                # on request).
                #
                # This means the build was finished by the other process, or is already
                # being processed (so the build is locked).
                logging.info('Paygen skipped because: %s', e)
示例#12
0
    def createStandardClient(self):
        """Test helper method to create a client with standard arguments."""

        client = signer_payloads_client.SignerPayloadsClientGoogleStorage(
            build=gspaths.Build(channel='foo-channel',
                                board='foo-board',
                                version='foo-version',
                                bucket='foo-bucket'),
            work_dir=self.tempdir,
            unique='foo-unique',
            ctx=self.ctx)
        return client
示例#13
0
    def testImagesNotReady(self):
        """See that we do the right thing if there are no images for the build."""
        target_build = gspaths.Build(bucket='crt',
                                     channel='canary-channel',
                                     board='auron-yuna',
                                     version='9999.0.0')

        paygen = self._GetPaygenBuildInstance(target_build)

        with self.assertRaises(paygen_build_lib.BuildNotReady):
            paygen._DiscoverRequiredPayloads()

        # Re-run with a test image, but no signed images.
        self.addTestImage(target_build)
        with self.assertRaises(paygen_build_lib.BuildNotReady):
            paygen._DiscoverRequiredPayloads()
  def testBuild(self):
    default_input = {
        'channel': 'foo-channel',
        'board': 'board-name',
        'version': '1.2.3',
    }
    default_expected = {
        'bucket': None,
        'channel': 'foo-channel',
        'board': 'board-name',
        'version': '1.2.3',
        'uri': None,
    }
    expected_str = ("Build definition (board='board-name',"
                    " version='1.2.3', channel='foo-channel')")

    build = gspaths.Build(default_input)
    self.assertEqual(build, default_expected)

    self.assertEqual(expected_str, str(build))
示例#15
0
def _GenSignedGSPath(image, image_type):
    """Take a SignedImage_pb2 and return a gspaths.Image.

  Args:
    image (SignedImage_pb2): The build to create the gspath from.
    image_type (string): The image type, either "recovery" or "base".

  Returns:
    A gspaths.Image instance.
  """
    build = gspaths.Build(board=image.build.build_target.name,
                          version=image.build.version,
                          channel=image.build.channel,
                          bucket=image.build.bucket)

    build_uri = gspaths.ChromeosReleases.ImageUri(build, image.key, image_type)

    build.uri = build_uri

    return gspaths.Image(build=build, image_type=image_type, uri=build_uri)
示例#16
0
    def _FindFullTestPayloads(self, channel, version):
        """Returns a list of full test payloads for a given version.

    Uses the current build's board and bucket values. This method caches the
    full test payloads previously discovered as we may be using them for
    multiple tests in a single run.

    Args:
      channel: Channel to look in for payload.
      version: A build version whose payloads to look for.

    Returns:
      A (possibly empty) list of payload URIs.
    """
        assert channel
        assert version

        if (channel, version) in self._version_to_full_test_payloads:
            # Serve from cache, if possible.
            return self._version_to_full_test_payloads[(channel, version)]

        build = gspaths.Build(channel=channel,
                              board=self._build.board,
                              version=version,
                              bucket=self._build.bucket)

        payload_search_uri = gspaths.ChromeosReleases.PayloadUri(build, '*')
        payload_candidate = self._ctx.LS(payload_search_uri)

        # We create related files for each payload that have the payload name
        # plus these extensions. Skip these files.
        NOT_PAYLOAD = ('.json', '.log')
        full_test_payloads = [
            u for u in payload_candidate
            if not any([u.endswith(n) for n in NOT_PAYLOAD])
        ]
        # Store in cache.
        self._version_to_full_test_payloads[(channel,
                                             version)] = full_test_payloads
        return full_test_payloads
  def testBuildValuesFromUri(self):
    """Tests BuildValuesFromUri"""

    exp = (r'^gs://(?P<bucket>.*)/(?P<channel>.*)/(?P<board>.*)/'
           r'(?P<version>.*)/chromeos_(?P<image_version>[^_]+)_'
           r'(?P=board)_(?P<image_type>[^_]+)_(?P<image_channel>[^_]+)_'
           '(?P<key>[^_]+).bin$')
    uri = ('gs://chromeos-releases/dev-channel/link/4537.7.0/'
           'chromeos_4537.7.1_link_recovery_nplusone-channel_mp-v4.bin')

    values = gspaths.Build.BuildValuesFromUri(exp, uri)
    self.assertEqual(values, {'build': gspaths.Build(bucket='chromeos-releases',
                                                     version='4537.7.0',
                                                     board='link',
                                                     channel='dev-channel'),
                              'image_version': '4537.7.1',
                              'image_type': 'recovery',
                              'image_channel': 'nplusone-channel',
                              'key': 'mp-v4'})

    uri = 'foo-uri'
    self.assertIsNone(gspaths.Build.BuildValuesFromUri(exp, uri))
    def __init__(self, private_key, work_dir=None):
        """A signer that signs an update payload with a given key.

    For example there is no test key that can be picked up by
    gs://chromeos-release-test bucket, so this way we can reliably sign and
    verify a payload when needed. Also it can be used to sign payloads locally
    when needed. delta_generator accepts a --private_key flag that allows
    signing the payload inplace. However, it is better to go through the whole
    process of signing the payload, assuming we don't have access to the signers
    at that time. This allows us the keep the signing process (or at least part
    of it) tested constantly.

    Args:
      private_key: A 2048 bits private key in PEM format for signing.
      work_dir: A directory inside the chroot to be used for temporarily
                manipulating files. The directory should be cleaned by the
                caller. If None is passed, the directory will be created.
    """
        assert private_key, 'No private key in PEM format is passed for signing.'

        self._private_key = private_key

        super(UnofficialSignerPayloadsClient,
              self).__init__(gspaths.Build(), work_dir)
示例#19
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
示例#20
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')
    def PerformStage(self):
        """Invoke payload generation. If testing is enabled, schedule tests.

    This method is intended to be safe to invoke inside a process.
    """
        # Convert to release tools naming for channels.
        if not self.channel.endswith('-channel'):
            self.channel += '-channel'

        with osutils.TempDir(sudo_rm=True) as tempdir:
            # Create the definition of the build to generate payloads for.
            build = gspaths.Build(channel=self.channel,
                                  board=self.board,
                                  version=self.version,
                                  bucket=gspaths.ChromeosReleases.BUCKET)
            payload_build = gspaths.Build(build)
            if self.debug:
                payload_build.bucket = gspaths.ChromeosReleases.TEST_BUCKET

            try:
                # Generate the payloads.
                self._PrintLoudly('Starting %s, %s, %s' %
                                  (self.channel, self.version, self.board))
                paygen = paygen_build_lib.PaygenBuild(
                    build,
                    payload_build,
                    work_dir=tempdir,
                    site_config=self._run.site_config,
                    dry_run=self.debug,
                    skip_delta_payloads=self.skip_delta_payloads,
                    skip_duts_check=self.skip_duts_check)

                testdata = paygen.CreatePayloads()

                # Now, schedule the payload tests if desired.
                if not self.skip_testing:
                    (suite_name, archive_board, archive_build,
                     payload_test_configs) = testdata
                    # For unified builds, only test against the specified models.
                    if self._run.config.models:
                        models = []
                        for model in self._run.config.models:
                            # 'au' is a test suite generated in ge_build_config.json
                            if model.test_suites and 'au' in model.test_suites:
                                models.append(model)

                        if len(models) > 1:
                            fsi_configs = set(
                                p for p in payload_test_configs
                                if p.payload_type ==
                                paygen_build_lib.PAYLOAD_TYPE_FSI)
                            non_fsi_configs = set(p
                                                  for p in payload_test_configs
                                                  if p not in fsi_configs)
                            stages = self._ScheduleForApplicableModels(
                                archive_board, archive_build, fsi_configs,
                                suite_name)
                            stages += self._ScheduleForModels(
                                archive_board, archive_build, models,
                                non_fsi_configs, suite_name)
                            steps = [stage.Run for stage in stages]
                            parallel.RunParallelSteps(steps)
                        elif len(models) == 1:
                            model = models[0]
                            PaygenTestStage(
                                self._run, self.buildstore, suite_name,
                                archive_board, model.name,
                                model.lab_board_name, self.channel,
                                archive_build, self.skip_duts_check,
                                self.debug, payload_test_configs,
                                config_lib.GetHWTestEnv(
                                    self._run.config,
                                    model_config=model)).Run()
                    else:
                        lab_board_name = config_lib.GetNonUniBuildLabBoardName(
                            archive_board)
                        PaygenTestStage(
                            self._run, self.buildstore, suite_name,
                            archive_board, None, lab_board_name, self.channel,
                            archive_build, self.skip_duts_check, self.debug,
                            payload_test_configs,
                            config_lib.GetHWTestEnv(self._run.config)).Run()

            except (paygen_build_lib.BuildLocked) as e:
                # These errors are normal if it's possible that another builder is
                # processing the same build. (perhaps by a trybot generating payloads on
                # request).
                logging.info('PaygenBuild for %s skipped because: %s',
                             self.channel, e)
 def setUp(self):
   self.build = gspaths.Build(bucket='crt', channel='foo-channel',
                              board='board-name', version='1.2.3')
示例#23
0
    def PerformStage(self):
        """Invoke payload generation. If testing is enabled, schedule tests.

    This method is intended to be safe to invoke inside a process.
    """
        # Convert to release tools naming for channels.
        if not self.channel.endswith('-channel'):
            self.channel += '-channel'

        with osutils.TempDir(sudo_rm=True) as tempdir:
            # Create the definition of the build to generate payloads for.
            build = gspaths.Build(channel=self.channel,
                                  board=self.board,
                                  version=self.version)

            try:
                # Generate the payloads.
                self._PrintLoudly('Starting %s, %s, %s' %
                                  (self.channel, self.version, self.board))
                paygen = paygen_build_lib.PaygenBuild(
                    build,
                    work_dir=tempdir,
                    site_config=self._run.site_config,
                    dry_run=self.debug,
                    skip_delta_payloads=self.skip_delta_payloads,
                    skip_duts_check=self.skip_duts_check)

                testdata = paygen.CreatePayloads()

                # Now, schedule the payload tests if desired.
                if not self.skip_testing:
                    suite_name, archive_board, archive_build = testdata

                    # For unified builds, only test against the specified models.
                    if self._run.config.models:
                        models = []
                        for model in self._run.config.models:
                            # 'au' is a test suite generated in ge_build_config.json
                            if model.test_suites and 'au' in model.test_suites:
                                models.append(model)

                        if len(models) > 1:
                            stages = [
                                PaygenTestStage(self._run, suite_name,
                                                archive_board, model.name,
                                                model.lab_board_name,
                                                self.channel, archive_build,
                                                self.skip_duts_check,
                                                self.debug) for model in models
                            ]
                            steps = [stage.Run for stage in stages]
                            parallel.RunParallelSteps(steps)
                        elif len(models) == 1:
                            PaygenTestStage(self._run, suite_name,
                                            archive_board, models[0].name,
                                            models[0].lab_board_name,
                                            self.channel, archive_build,
                                            self.skip_duts_check,
                                            self.debug).Run()
                    else:
                        PaygenTestStage(self._run, suite_name, archive_board,
                                        None, archive_board, self.channel,
                                        archive_build, self.skip_duts_check,
                                        self.debug).Run()

            except (paygen_build_lib.BuildLocked) as e:
                # These errors are normal if it's possible that another builder is
                # processing the same build. (perhaps by a trybot generating payloads on
                # request).
                logging.info('PaygenBuild for %s skipped because: %s',
                             self.channel, e)
示例#24
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.
            ])
示例#25
0
    def _PaygenTestConfig(self, payload_test, suite_name):
        """Generate paygen test config for a given payload test.

    Args:
      payload_test: A PayloadTest object.
      suite_name: A string suite name.

    Returns:
      A test_params.TestConfig object.
    """
        # Figure out the source version for the test.
        payload = payload_test.payload
        src_version = payload_test.src_version
        src_channel = payload_test.src_channel

        # Discover the full test payload that corresponds to the source version.
        src_payload_uri_list = self._FindFullTestPayloads(
            src_channel, src_version)
        if not src_payload_uri_list:
            logging.error(
                'Cannot find full test payload for source version (%s), '
                'control file not generated', src_version)
            raise PayloadTestError(
                'cannot find source payload for testing %s' % payload)

        if len(src_payload_uri_list) != 1:
            logging.error(
                'Found multiple (%d) full test payloads for source version '
                '(%s), control file not generated:\n%s',
                len(src_payload_uri_list), src_version,
                '\n'.join(src_payload_uri_list))
            raise PayloadTestError(
                'multiple source payloads found for testing %s' % payload)

        src_payload_uri = src_payload_uri_list[0]
        logging.info('Source full test payload found at %s', src_payload_uri)

        build = gspaths.Build(channel=src_channel,
                              board=self._build.board,
                              version=src_version,
                              bucket=self._build.bucket)
        release_archive_uri = gspaths.ChromeosReleases.BuildUri(build)

        # TODO(dgarrett): Remove if block after finishing crbug.com/523122
        stateful_uri = os.path.join(release_archive_uri, 'stateful.tgz')
        if not self._ctx.Exists(stateful_uri):
            logging.error('%s does not exist.', stateful_uri)
            logging.error(
                'Full test payload for source version (%s) exists, but '
                'stateful.tgz does not. Control file not generated',
                src_version)
            raise PayloadTestError(
                'cannot find source stateful.tgz for testing %s' % payload)

        return test_params.TestConfig(
            self._archive_board,
            suite_name,  # Name of the test (use the suite name).
            bool(payload.src_image),  # Whether this is a delta.
            src_version,
            payload.tgt_image.build.version,
            src_payload_uri,
            payload.uri,
            suite_name=suite_name,
            source_archive_uri=release_archive_uri,
            payload_type=payload_test.payload_type,
            applicable_models=payload_test.applicable_models)
示例#26
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),
        ])