def generate_task_dependency_validator(self): en_US_tmpl = "release-beta_firefox_{}_complete_en-US_beetmover_candidates" en_US_partials_tmpl = "release-beta_firefox_{p}_partial_en-US_{v}build{n}_beetmover_candidates" l10n_tmpl = "release-beta_firefox_{}_l10n_repack_beetmover_candidates_1" l10n_partials_tmpl = "release-beta_firefox_{p}_l10n_repack_partial_{v}build{n}_beetmover_candidates_1" en_US_balrog_tmpl = "{p}_en-US_{v}build{n}_funsize_balrog_task" l10n_balrog_tmpl = "release-beta_firefox_{p}_l10n_repack_1_{v}_balrog_task" requires = [] for completes in (en_US_tmpl, l10n_tmpl): requires.extend([ get_task_by_name(self.graph, completes.format(p))["taskId"] for p in ("macosx64", "win32", "win64") ]) for partials in (en_US_partials_tmpl, l10n_partials_tmpl, en_US_balrog_tmpl, l10n_balrog_tmpl): requires.extend([ get_task_by_name(self.graph, partials.format(p=platform, v=p_version, n=p_build_num))["taskId"] for platform in ("macosx64", "win32", "win64") for p_version, p_build_num in (('38.0', '1'), ('37.0', '2')) ]) requires.append(get_task_by_name(self.graph, "release-beta-firefox_updates")["taskId"]) @truth def validate_task_dependencies(task): return sorted(requires) == sorted(task['requires']) return validate_task_dependencies
def test_source_sig_required_by_push_to_mirrors(self): push_to_mirrors = get_task_by_name( self.graph, "release-foo_firefox_push_to_releases") foo_source_signing_beet = get_task_by_name(self.graph, "foo_source_signing_beet") self.assertIn(foo_source_signing_beet["taskId"], push_to_mirrors["requires"])
def setUp(self): self.task_schema = Schema({ 'task': { 'provisionerId': 'aws-provisioner-v1', 'workerType': 'opt-linux64', } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'push_to_candidates_enabled': True, 'en_US_config': EN_US_CONFIG, 'l10n_config': self.l10n_config, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'final_verify_channels': ['beta'], 'release_channels': ['beta'] }) self.graph = make_task_graph(**test_kwargs) self.tasks = { 'win32': get_task_by_name( self.graph, "release-{}_{}_{}_l10n_repack_partial_{}build{}_beetmover_candidates_{}".format( "mozilla-beta", "firefox", 'win32', "38.0", 1, 1 ) ), 'macosx64': get_task_by_name( self.graph, "release-{}_{}_{}_l10n_repack_partial_{}build{}_beetmover_candidates_{}".format( "mozilla-beta", "firefox", 'macosx64', "37.0", 2, 1 ) ), }
def setUp(self): self.graph_schema = Schema({ 'scopes': generate_scope_validator(scopes={ "queue:*", "docker-worker:*", "scheduler:*", "project:releng:signing:format:gpg", "project:releng:signing:format:mar", "project:releng:signing:cert:release-signing", "docker-worker:feature:balrogVPNProxy" }) }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'en_US_config': { "platforms": { "macosx64": {"task_id": "xyz"}, "win32": {"task_id": "xyy"} } }, }) self.graph = make_task_graph(**test_kwargs) self.generator_image = get_task_by_name(self.graph, "funsize_update_generator_image") self.funsize_balrog_image = get_task_by_name(self.graph, "funsize_balrog_image")
def test_funsize_name(self): for platform in ("win32", "linux64",): for version in ("37.0", "38.0",): for chunk in ('1', '2',): generator_schema = Schema({ 'task': {'metadata': { 'name': "[funsize] Update generating task %s chunk %s for %s" % (platform, chunk, version,)}} }, extra=True, required=True) signing_schema = Schema({ 'task': {'metadata': { 'name': "[funsize] MAR signing task %s chunk %s for %s" % (platform, chunk, version,)}} }, extra=True, required=True) balrog_schema = Schema({ 'task': {'metadata': { 'name': "[funsize] Publish to Balrog %s chunk %s for %s" % (platform, chunk, version,)}} }, extra=True, required=True) generator = get_task_by_name(self.graph, "release-mozilla-beta_firefox_{pl}_l10n_repack_{c}_{part}_update_generator".format( pl=platform, part=version, c=chunk)) signing = get_task_by_name(self.graph, "release-mozilla-beta_firefox_{pl}_l10n_repack_{c}_{part}_signing_task".format( pl=platform, part=version, c=chunk)) balrog = get_task_by_name(self.graph, "release-mozilla-beta_firefox_{pl}_l10n_repack_{c}_{part}_balrog_task".format( pl=platform, part=version, c=chunk)) verify(generator, generator_schema) verify(signing, signing_schema) verify(balrog, balrog_schema)
def generate_task_requires_validator(self): en_US_tmpl = "release-mozilla-beta_firefox_{}_complete_en-US_beetmover_candidates" en_US_partials_tmpl = "release-mozilla-beta_firefox_{}_partial_en-US_{}build{}_beetmover_candidates" l10n_tmpl = "release-mozilla-beta_firefox_{}_l10n_repack_beetmover_candidates_1" l10n_partials_tmpl = "release-mozilla-beta_firefox_{}_l10n_repack_partial_{}build{}_beetmover_candidates_1" requires = [] for completes in (en_US_tmpl, l10n_tmpl): requires.extend([ get_task_by_name(self.graph, completes.format(p))["taskId"] for p in ("macosx64", "win32") ]) for partials in (en_US_partials_tmpl, l10n_partials_tmpl): requires.extend([ get_task_by_name(self.graph, partials.format(platform, p_version, p_build_num))[ "taskId"] for platform in ("macosx64", "win32") for p_version, p_build_num in (('38.0', '1'), ('37.0', '2')) ]) requires.append(get_task_by_name(self.graph, "release-mozilla-beta-firefox_chcksms")["taskId"]) @truth def validate_task_requires(task): return sorted(task['requires']) == sorted(requires) return validate_task_requires
def generate_command_requirements_validator(self, platform): if platform == 'win32': buildername = "release-mozilla-beta_firefox_win32_l10n_repack_1_38.0_signing_task" funsize_artifact = get_task_by_name(self.graph, buildername) required_elements = ( "--partial-version 38.0", "--locale de --locale en-GB --locale zh-TW", "--taskid {}".format(funsize_artifact['taskId']), "--platform {}".format(buildbot2ftp(platform)), "--version 42.0b2", ) elif platform == 'macosx64': buildername = "release-mozilla-beta_firefox_macosx64_l10n_repack_1_37.0_signing_task" funsize_artifact = get_task_by_name(self.graph, buildername) required_elements = ( "--partial-version 37.0", "--locale de --locale en-GB --locale zh-TW", "--taskid {}".format(funsize_artifact['taskId']), "--platform {}".format(buildbot2ftp(platform)), "--version 42.0b2", ) @truth def validate_command_requirements(task): command = ''.join(task['task']['payload']['command']) for element in required_elements: if element not in command: return False else: return True return validate_command_requirements
def setUp(self): self.graph_schema = Schema({ 'scopes': generate_scope_validator(scopes={ "docker-worker:image:taskcluster/builder:*", "queue:define-task:aws-provisioner-v1/opt-linux64", "queue:create-task:aws-provisioner-v1/opt-linux64", "queue:define-task:aws-provisioner-v1/build-c4-2xlarge", "queue:create-task:aws-provisioner-v1/build-c4-2xlarge", "project:releng:signing:format:gpg", "project:releng:signing:cert:release-signing", }) }, extra=True, required=True) self.task_schema = Schema({ 'task': { 'scopes': generate_scope_validator(scopes={ "queue:define-task:aws-provisioner-v1/opt-linux64", "queue:create-task:aws-provisioner-v1/opt-linux64", "queue:define-task:aws-provisioner-v1/build-c4-2xlarge", "queue:create-task:aws-provisioner-v1/build-c4-2xlarge", }), 'provisionerId': 'aws-provisioner-v1', 'workerType': 'opt-linux64', 'payload': { 'image': str, 'command': list, 'artifacts': dict, 'env': { 'VERSION': '42.0b2', }, } } }, extra=True, required=True) self.signing_task_schema = Schema({ 'task': { 'scopes': generate_scope_validator(scopes={ "project:releng:signing:format:gpg", "project:releng:signing:cert:release-signing", }), 'provisionerId': 'signing-provisioner-v1', 'workerType': 'signing-worker-v1', 'payload': All(Length(1), { 'signingManifest': str, }) } }, required=True, extra=True) test_kwargs = create_firefox_test_args({ 'snap_enabled': True, 'en_US_config': EN_US_CONFIG, 'signing_pvt_key': PVT_KEY_FILE, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "foo_snap") self.signing_task = get_task_by_name(self.graph, "foo_snap_signing")
def setUp(self): test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'push_to_candidates_enabled': True, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'enUS_platforms': ['win32'], 'en_US_config': { "platforms": { "win32": {"task_id": "xyy"} } }, 'l10n_config': { "platforms": { "win32": { "en_us_binary_url": "https://queue.taskcluster.net/something/firefox.exe", "locales": ["de", "en-GB", "ru", "uk", "zh-TW"], "chunks": 1, }, "linux64": { "en_us_binary_url": "https://queue.taskcluster.net/something/firefox.tar.xz", "locales": ["de", "en-GB", "ru", "uk", "zh-TW"], "chunks": 1, }, }, "changesets": { "de": "default", "en-GB": "default", "ru": "default", "uk": "default", "zh-TW": "default", }, }, 'partial_updates': { '38.0': { 'buildNumber': 1, 'locales': [ 'de', 'en-GB', 'ru', 'uk', 'zh-TW' ] }, '37.0': { 'buildNumber': 2, 'locales': [ 'de', 'en-GB', 'ru', 'uk' ] } } }) self.graph = make_task_graph(**test_kwargs) self.update_generator_37 = get_task_by_name(self.graph, "release-mozilla-beta_firefox_win32_l10n_repack_1_37.0_update_generator") self.update_generator_38 = get_task_by_name(self.graph, "release-mozilla-beta_firefox_win32_l10n_repack_1_38.0_update_generator") self.beetmover_candidates_37 = get_task_by_name(self.graph, "release-mozilla-beta_firefox_win32_l10n_repack_partial_37.0build2_beetmover_candidates_1") self.beetmover_candidates_38 = get_task_by_name(self.graph, "release-mozilla-beta_firefox_win32_l10n_repack_partial_38.0build1_beetmover_candidates_1")
def generate_task_requires_validator(self): requires = [ get_task_by_name(self.graph, "release-foo_firefox_push_to_releases")["taskId"], get_task_by_name(self.graph, "release-foo-firefox_partner_repacks_copy_to_releases")["taskId"], ] @truth def validate_task_requires(task): return sorted(requires) == sorted(task['requires']) return validate_task_requires
def test_funsize_name(self): for p in ("win32", "macosx64",): for v in ("38.0build1", "37.0build2",): generator = get_task_by_name(self.graph, "{}_en-US_{}_funsize_update_generator".format(p, v)) signing = get_task_by_name(self.graph, "{}_en-US_{}_funsize_signing_task".format(p, v)) balrog = get_task_by_name(self.graph, "{}_en-US_{}_funsize_balrog_task".format(p, v)) self.assertEquals(generator["task"]["metadata"]["name"], "[funsize] Update generating task %s %s for %s" % (p, "en-US", v.split('build')[0],)) self.assertEquals(signing["task"]["metadata"]["name"], "[funsize] MAR signing task %s %s for %s" % (p, "en-US", v.split('build')[0],)) self.assertEquals(balrog["task"]["metadata"]["name"], "[funsize] Publish to Balrog %s %s for %s" % (p, "en-US", v.split('build')[0],))
def test_partials_present(self): for pl in ["win32", "linux64"]: for part in ["37.0", "38.0"]: for chunk in [1, 2]: task_name1 = "release-mozilla-beta_firefox_{pl}_l10n_repack_{chunk}_{part}_update_generator".format( pl=pl, part=part, chunk=chunk) task_name2 = "release-mozilla-beta_firefox_{pl}_l10n_repack_{chunk}_{part}_signing_task".format( pl=pl, part=part, chunk=chunk) self.assertIsNotNone(get_task_by_name( self.graph, task_name1)) self.assertIsNotNone(get_task_by_name( self.graph, task_name2))
def setUp(self): self.graph = make_task_graph( version="42.0b2", next_version="42.0b3", appVersion="42.0", buildNumber=3, source_enabled=False, checksums_enabled=False, en_US_config={ "platforms": { "macosx64": {}, "win32": {}, "win64": {}, "linux": {}, "linux64": {}, } }, l10n_config={}, repo_path="releases/foo", product="firefox", revision="fedcba654321", mozharness_changeset="abcd", partial_updates={ "38.0": { "buildNumber": 1, "locales": ["de", "en-GB", "zh-TW"], }, "37.0": { "buildNumber": 2, "locales": ["de", "en-GB", "zh-TW"], }, }, branch="foo", updates_enabled=False, bouncer_enabled=True, push_to_candidates_enabled=False, push_to_releases_enabled=False, uptake_monitoring_enabled=False, postrelease_version_bump_enabled=True, postrelease_bouncer_aliases_enabled=False, signing_class="release-signing", release_channels=["foo"], final_verify_channels=["foo"], balrog_api_root="https://balrog.real/api", funsize_balrog_api_root="http://balrog/api", signing_pvt_key=PVT_KEY_FILE, build_tools_repo_path='build/tools', ) self.task = get_task_by_name( self.graph, "release-foo-firefox_version_bump") self.human_task = get_task_by_name( self.graph, "post_release_human_decision") self.payload = self.task["task"]["payload"]
def test_not_required_by_push_to_mirrors(self): push_to_mirrors = get_task_by_name( self.graph, "release-foo_firefox_push_to_releases") for platform in ["win32", "linux"]: partner_repacks = get_task_by_name( self.graph, "release-foo-firefox-{}_partner_repacks".format(platform)) self.assertNotIn(partner_repacks["taskId"], push_to_mirrors["requires"]) eme_free = get_task_by_name( self.graph, "release-foo-firefox-{}_eme_free_repacks".format(platform)) self.assertNotIn(eme_free["taskId"], push_to_mirrors["requires"])
def test_task_scopes(self): for p in ("win32", "macosx64"): for v in ("38.0build1", "37.0build2"): generator = get_task_by_name(self.graph, "{}_en-US_{}_funsize_update_generator".format(p, v)) signing = get_task_by_name(self.graph, "{}_en-US_{}_funsize_signing_task".format(p, v)) balrog = get_task_by_name(self.graph, "{}_en-US_{}_funsize_balrog_task".format(p, v)) self.assertIsNone(generator["task"].get("scopes")) self.assertItemsEqual( signing["task"]["scopes"], ["project:releng:signing:cert:release-signing", "project:releng:signing:format:mar", "project:releng:signing:format:gpg"]) self.assertItemsEqual(balrog["task"]["scopes"], ["docker-worker:feature:balrogVPNProxy"])
def setUp(self): self.graph = make_task_graph( version="42.0b2", next_version="42.0b3", appVersion="42.0", buildNumber=3, source_enabled=False, checksums_enabled=False, updates_enabled=True, bouncer_enabled=False, push_to_candidates_enabled=True, beetmover_candidates_bucket="mozilla-releng-beet-mover-dev", push_to_releases_enabled=False, uptake_monitoring_enabled=False, postrelease_version_bump_enabled=False, postrelease_bouncer_aliases_enabled=False, en_US_config=self.en_US_config, l10n_config=self.l10n_config, partial_updates={ "38.0": {"buildNumber": 1, "locales": ["de", "en-GB", "zh-TW"]}, "37.0": {"buildNumber": 2, "locales": ["de", "en-GB", "zh-TW"]}, }, balrog_api_root="https://balrog.real/api", funsize_balrog_api_root="http://balrog/api", signing_class="release-signing", branch="mozilla-beta", product="firefox", repo_path="releases/mozilla-beta", revision="abcdef123456", mozharness_changeset="abcd", release_channels=["beta"], final_verify_channels=["beta"], signing_pvt_key=PVT_KEY_FILE, build_tools_repo_path="build/tools", ) self.tasks = { "win32": get_task_by_name( self.graph, "release-{}_{}_{}_l10n_repack_partial_{}build{}_beetmover_candidates_{}".format( "mozilla-beta", "firefox", "win32", "38.0", 1, 1 ), ), "macosx64": get_task_by_name( self.graph, "release-{}_{}_{}_l10n_repack_partial_{}build{}_beetmover_candidates_{}".format( "mozilla-beta", "firefox", "macosx64", "37.0", 2, 1 ), ), }
def test_funsize_name(self): for platform in ("win32", "linux64",): for version in ("37.0", "38.0",): generator = get_task_by_name(self.graph, "release-mozilla-beta_firefox_{pl}_l10n_repack_1_{part}_update_generator".format(pl=platform, part=version)) signing = get_task_by_name(self.graph, "release-mozilla-beta_firefox_{pl}_l10n_repack_1_{part}_signing_task".format(pl=platform, part=version)) balrog = get_task_by_name(self.graph, "release-mozilla-beta_firefox_{pl}_l10n_repack_1_{part}_balrog_task".format(pl=platform, part=version)) self.assertEqual(generator["task"]["metadata"]["name"], "[funsize] Update generating task %s chunk %s for %s" % (platform, "1", version,)) self.assertEqual(signing["task"]["metadata"]["name"], "[funsize] MAR signing task %s chunk %s for %s" % (platform, "1", version,)) self.assertEqual(balrog["task"]["metadata"]["name"], "[funsize] Publish to Balrog %s chunk %s for %s" % (platform, "1", version,))
def generate_task_requires_validator(self): requires = [ get_task_by_name(self.graph, "release-foo_firefox_push_to_releases")["taskId"], get_task_by_name( self.graph, "release-foo-firefox_partner_repacks_copy_to_releases") ["taskId"], ] @truth def validate_task_requires(task): return sorted(requires) == sorted(task['requires']) return validate_task_requires
def test_partials_present(self): for pl in ["win32", "linux64"]: for part in ["37.0", "38.0"]: for chunk in [1, 2]: partials_name_1 = "release-mozilla-beta_firefox_{pl}_l10n_repack_{chunk}_{part}_update_generator".format( pl=pl, part=part, chunk=chunk) partials_name_2 = "release-mozilla-beta_firefox_{pl}_l10n_repack_{chunk}_{part}_signing_task".format( pl=pl, part=part, chunk=chunk) partials_1 = get_task_by_name(self.graph, partials_name_1) partials_2 = get_task_by_name(self.graph, partials_name_2) # Verify the partial tasks are not none verify(partials_1, self.partials_schema) verify(partials_2, self.partials_schema)
def setUp(self): test_kwargs = create_firefox_test_args({ 'source_enabled': True, 'push_to_candidates_enabled': True, 'push_to_releases_enabled': True, 'push_to_releases_automatic': True, 'release_channels': ['foo', 'bar'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': EN_US_CONFIG, }) self.graph = make_task_graph(**test_kwargs) self.push_to_mirrors = get_task_by_name(self.graph, "release-foo_firefox_push_to_releases") self.foo_source_signing_beet = get_task_by_name(self.graph, "foo_source_signing_beet") self.foo_source_beet = get_task_by_name(self.graph, "foo_source_beet")
def setUp(self): self.graph_schema = Schema({ 'scopes': generate_scope_validator(scopes={'queue:task-priority:high'}), }, required=True, extra=True) self.human_task_schema = Schema({ 'task': { 'provisionerId': 'null-provisioner', 'workerType': 'human-decision', } }, required=True, extra=True) self.task_schema = Schema({ 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'product': 'firefox', 'version': '42.0b2', 'build_number': 3, 'repo_path': 'releases/foo', 'script_repo_revision': 'abcd', 'revision': 'abcdef123456', 'tuxedo_server_url': 'https://bouncer.real.allizom.org/api', } } } }, required=True, extra=True) test_kwargs = create_firefox_test_args({ 'postrelease_bouncer_aliases_enabled': True, 'release_channels': ['foo'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': { "platforms": { "macosx64": {}, "win32": {}, "win64": {}, "linux": {}, "linux64": {}, } }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo-firefox_bouncer_aliases") self.human_task = get_task_by_name(self.graph, "publish_release_human_decision")
def test_new_locale_not_in_update_generator(self): t = get_task_by_name( self.graph, "release-mozilla-beta_firefox_win32_l10n_repack_1_37.0_update_generator") self.assertEqual( sorted(["de", "en-GB", "ru", "uk"]), sorted([p["locale"] for p in t["task"]["extra"]["funsize"]["partials"]]))
def test_partials_present(self): for pl in ["win32", "linux64"]: for part in ["37.0", "38.0"]: task_name = "release-mozilla-beta_firefox_{pl}_l10n_repack_1_{part}_update_generator".format( pl=pl, part=part) self.assertIsNotNone(get_task_by_name( self.graph, task_name))
def test_requires(self): tmpl = "release-foo_firefox_{}_complete_en-US_beetmover_candidates" requires = [ get_task_by_name(self.graph, tmpl.format(p))["taskId"] for p in ("linux", "linux64", "macosx64", "win32", "win64") ] self.assertEqual(sorted(self.task["requires"]), sorted(requires))
def setUp(self): self.task_schema = Schema({ 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'CHANNEL': 'beta-cdntest' } } } }, extra=True, required=True) test_args = create_firefox_test_args({ 'updates_enabled': True, 'push_to_candidates_enabled': True, 'push_to_releases_enabled': True, 'update_verify_enabled': True, 'updates_builder_enabled': True, 'signing_pvt_key': PVT_KEY_FILE, 'branch': 'beta', 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'l10n_config': L10N_CONFIG, 'en_US_config': EN_US_CONFIG, 'uptake_monitoring_enabled': True, 'update_verify_channel': 'beta-cdntest', 'update_verify_requires_cdn_push': True, }) self.graph = make_task_graph(**test_args) self.task = get_task_by_name(self.graph, "release-beta_firefox_win32_update_verify_beta_3")
def setUp(self): self.graph_schema = Schema({ 'scopes': generate_scope_validator(scopes={'queue:task-priority:high'}), }, extra=True, required=True) self.test_schema = Schema({ 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'version': '42.0b2', 'build_number': 3, } } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'push_to_candidates_enabled': True, 'checksums_enabled': True, 'updates_enabled': True, 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['foo'], 'final_verify_channels': ['foo'], 'en_US_config': { "platforms": { "macosx64": {"task_id": "abc"}, "win64": {"task_id": "jgh"}, "linux64": {"task_id": "lmn"}, } }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo-firefox_chcksms")
def test_encryption(self): self.task_schema = Schema({ 'task': { 'payload': { 'encryptedEnv': All(Length(2), [Match(r'^wcB')]) # Must have 2 elements, starting with wcB } } }, required=True, extra=True) test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'repo_path': 'foo/bar', 'branch': 'mozilla-beta', 'signing_class': 'dep-signing', 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': { "platforms": { "macosx64": {"task_id": "xyz"}, "win32": {"task_id": "xyy"} } }, }) graph = make_task_graph(**test_kwargs) do_common_assertions(graph) for p in ("win32", "macosx64"): for v in ("38.0build1", "37.0build2"): balrog = get_task_by_name(graph, "{}_en-US_{}_funsize_balrog_task".format(p, v)) verify(balrog, self.task_schema)
def setUp(self): self.task_schema = Schema({ 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'balrog_api_root': 'https://balrog.real/api', 'channels': 'alpha, release-dev', } } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'push_to_candidates_enabled': True, 'push_to_releases_enabled': True, 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['foo'], 'final_verify_channels': ['foo'], 'publish_to_balrog_channels': ["release-dev", "alpha"], 'en_US_config': { "platforms": { "macosx64": {"task_id": "abc"}, "win32": {"task_id": "def"}, "win64": {"task_id": "jgh"}, "linux": {"task_id": "ijk"}, "linux64": {"task_id": "lmn"}, } }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo-firefox_publish_balrog")
def test_taskid_in_command(self): for platform, task in self.tasks.iteritems(): l10n_artifact_task = get_task_by_name( self.graph, "release-mozilla-beta_firefox_{}_l10n_repack_artifacts_1".format(platform) ) command = task["task"]["payload"]["command"] self.assertTrue("--taskid {}".format(l10n_artifact_task["taskId"]) in "".join(command))
def test_signing_manifests(self): for p in ("win32", "macosx64"): for v in ("38.0build1", "37.0build2"): generator = get_task_by_name(self.graph, "{}_en-US_{}_funsize_update_generator".format(p, v)) signing = get_task_by_name(self.graph, "{}_en-US_{}_funsize_signing_task".format(p, v)) balrog = get_task_by_name(self.graph, "{}_en-US_{}_funsize_balrog_task".format(p, v)) self.assertIsNone(generator["task"].get("scopes")) self.assertItemsEqual(signing["task"]["scopes"], ["project:releng:signing:cert:release-signing", "project:releng:signing:format:mar", "project:releng:signing:format:gpg"]) self.assertIsNotNone(balrog["task"].get("scopes")) self.assertEqual( signing["task"]["payload"]["signingManifest"], "https://queue.taskcluster.net/v1/task/%s/artifacts/public/env/manifest.json" % generator["taskId"])
def generate_command_requirements_validator(self, platform): l10n_artifact_task = get_task_by_name( self.graph, "release-mozilla-beta_firefox_{}_l10n_repack_artifacts_1".format(platform) ) task_id = l10n_artifact_task['taskId'] @truth def verify_command_requirements(task): command = ''.join(task['task']['payload']['command']) required_elements = ( "--app-version 42.0", "--locale de --locale en-GB --locale zh-TW", "--bucket fake_bucket", "--taskid {}".format(task_id), "--platform {}".format(buildbot2ftp(platform)), "--version 42.0b2", ) for element in required_elements: if element not in command: return False else: return True return verify_command_requirements
def generate_dependency_validator(self): requires = [get_task_by_name(self.graph, t)['taskId'] for t in self.upstream_dependencies] @truth def validate_partner_repack_dependencies(task): return sorted(task['requires']) == sorted(requires) return validate_partner_repack_dependencies
def generate_not_required_validator(self): push_to_mirrors = get_task_by_name(self.graph, "release-foo_firefox_push_to_releases") @truth def validate_not_required_dependencies(task): return task['taskId'] not in push_to_mirrors['requires'] return validate_not_required_dependencies
def generate_task_dependency_validator(self): tmpl = "release-foo_firefox_{}_complete_en-US_beetmover_candidates" requires = [get_task_by_name(self.graph, tmpl.format(p))["taskId"] for p in ("linux", "linux64", "macosx64", "win32", "win64",)] @truth def validate_task_dependencies(task): return sorted(task['requires']) == sorted(requires) return validate_task_dependencies
def test_partials_present(self): for pl in ["win32", "linux64"]: for part in ["37.0", "38.0"]: task_name = "release-mozilla-beta_firefox_{pl}_l10n_repack_1_{part}_update_generator".format( pl=pl, part=part) partial_task = get_task_by_name(self.graph, task_name) verify(partial_task, Schema( dict)) # The task must exist as a dict (ie not None)
def generate_task_dependency_validator(self): tmpl = "release-foo_firefox_{p}_complete_en-US_beetmover_candidates" tmpl_partials = "release-foo_firefox_{p}_partial_en-US_{v}build{b}_beetmover_candidates" requires = [ get_task_by_name(self.graph, tmpl.format(p=p))["taskId"] for p in ("linux64", "macosx64", "win64") ] + [ get_task_by_name(self.graph, tmpl_partials.format(p=p, v=v, b=b))["taskId"] for p in ("linux64", "macosx64", "win64") for v, b in [("37.0", 2), ("38.0", 1)] ] @truth def validate_dependencies(task): return sorted(task['requires']) == sorted(requires) return validate_dependencies
def setUp(self): self.graph_schema = Schema( { 'scopes': generate_scope_validator( scopes={ "queue:*", "docker-worker:*", "scheduler:*", "project:releng:signing:format:gpg", "project:releng:signing:format:mar", "project:releng:signing:cert:release-signing", "docker-worker:feature:balrogVPNProxy" }) }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'en_US_config': { "platforms": { "macosx64": { "task_id": "xyz" }, "win32": { "task_id": "xyy" } } }, }) self.graph = make_task_graph(**test_kwargs) self.generator_image = get_task_by_name( self.graph, "funsize_update_generator_image") self.funsize_balrog_image = get_task_by_name(self.graph, "funsize_balrog_image")
def setUp(self): self.graph_schema = Schema({ 'scopes': generate_scope_validator(scopes={ "queue:task-priority:high", "queue:define-task:aws-provisioner-v1/opt-linux64", "queue:create-task:aws-provisioner-v1/opt-linux64", }) }, required=True, extra=True) self.task_schema = Schema({ 'task': { 'provisionerId': 'aws-provisioner-v1', 'workerType': 'opt-linux64', } }, extra=True, required=True) self.human_task_schema = Schema({ 'task': { 'provisionerId': 'null-provisioner', 'workerType': 'human-decision', } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'checksums_enabled': True, 'updates_enabled': True, 'push_to_candidates_enabled': True, 'push_to_releases_enabled': True, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['beta', 'release'], 'final_verify_channels': ['beta', 'release'], 'partner_repacks_platforms': ['win32', 'macosx64'], 'en_US_config': EN_US_CONFIG, 'l10n_config': L10N_CONFIG, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name( self.graph, "release-{}_{}_push_to_releases".format("mozilla-beta", "firefox") ) self.human_task = get_task_by_name(self.graph, self.human_task_name)
def setUp(self): self.task_schema = Schema({ 'task': { 'provisionerId': 'aws-provisioner-v1', 'workerType': 'opt-linux64', 'extra': { 'build_props': { 'product': 'firefox', 'locales': ["de", "en-GB", "zh-TW"], 'branch': 'mozilla-beta', 'version': '42.0b2', 'revision': 'abcdef123456', 'platform': str, } } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'push_to_candidates_enabled': True, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': EN_US_CONFIG, 'l10n_config': self.l10n_config, }) self.graph = make_task_graph(**test_kwargs) self.tasks = { 'win32': get_task_by_name( self.graph, "release-{}_{}_{}_l10n_repack_beetmover_candidates_1".format("mozilla-beta", "firefox", 'win32') ), 'macosx64': get_task_by_name( self.graph, "release-{}_{}_{}_l10n_repack_beetmover_candidates_1".format("mozilla-beta", "firefox", 'macosx64') ), }
def generate_task_requires_validator(self): requires_sorted = sorted([ get_task_by_name(self.graph, "publish_release_human_decision")["taskId"] ]) @truth def validate_task_requires(task): return sorted(task['requires']) == requires_sorted return validate_task_requires
def generate_task_dependency_validator(self): requires = sorted([ get_task_by_name(self.graph, "release-foo_firefox_push_to_releases")["taskId"] ]) @truth def validate_task_dependencies(task): return sorted(requires) == sorted(task['requires']) return validate_task_dependencies
def generate_task_dependency_validator(self): requires = [ get_task_by_name(self.graph, "release-foo-firefox_uptake_monitoring")["taskId"] ] @truth def validate_dependencies(task): return sorted(task['requires']) == sorted(requires) return validate_dependencies
def setUp(self): self.graph_schema = Schema( { 'scopes': generate_scope_validator(scopes={'queue:task-priority:high'}) }, extra=True, required=True) self.task_schema = Schema( { 'task': { 'provisionerId': 'aws-provisioner-v1', 'workerType': 'b2gtest', 'payload': { 'image': Match(r'^rail/python-test-runner'), 'command': [str], 'env': dict, } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'push_to_releases_enabled': True, 'release_channels': ['beta', 'release'], 'final_verify_channels': ['beta', 'release'], 'final_verify_platforms': ["macosx64", "win32", "win64", "linux", "linux64"], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': { "platforms": { "macosx64": {}, "win32": {}, "win64": {}, "linux": {}, "linux64": {}, } }, }) self.graph = make_task_graph(**test_kwargs) self.tasks = [ get_task_by_name(self.graph, "{chan}_final_verify".format(chan=chan)) for chan in ( 'beta', 'release', ) ]
def setUp(self): self.task_schema = Schema( { 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'balrog_api_root': 'https://balrog.real/api', 'channels': 'alpha, release-dev', } } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'push_to_candidates_enabled': True, 'push_to_releases_enabled': True, 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['foo'], 'final_verify_channels': ['foo'], 'publish_to_balrog_channels': ["release-dev", "alpha"], 'en_US_config': { "platforms": { "macosx64": { "task_id": "abc" }, "win32": { "task_id": "def" }, "win64": { "task_id": "jgh" }, "linux": { "task_id": "ijk" }, "linux64": { "task_id": "lmn" }, } }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo-firefox_publish_balrog")
def setUp(self): test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'push_to_candidates_enabled': True, 'repo_path': 'releases/mozilla-beta', 'branch': 'mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'enUS_platforms': ["win32", "macosx64"], 'final_verify_platforms': ["macosx64", "win32"], 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'en_US_config': { "platforms": { "macosx64": { "task_id": "xyz" }, "win32": { "task_id": "xyy" } } }, 'l10n_config': { "platforms": { "win32": { "en_us_binary_url": "https://queue.taskcluster.net/something/firefox.exe", "locales": ["de", "en-GB", "zh-TW"], "chunks": 1, }, "macosx64": { "en_us_binary_url": "https://queue.taskcluster.net/something/firefox.tar.xz", "locales": ["de", "en-GB", "zh-TW"], "chunks": 1, }, }, "changesets": { "de": "default", "en-GB": "default", "zh-TW": "default", }, }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "beta_final_verify")
def generate_command_requirements_validator(self, platform): # Command requirements for win32 if platform == 'win32': buildername = "win32_en-US_38.0build1_funsize_signing_task" funsize_artifact = get_task_by_name(self.graph, buildername) required_elements = ( "--partial-version 38.0", "--locale en-US", "--taskid {}".format(funsize_artifact['taskId']), "--platform {}".format(buildbot2ftp(platform)), "--version 42.0b2", ) # Command requirements for macosx64 elif platform == 'macosx64': buildername = "macosx64_en-US_37.0build2_funsize_signing_task" funsize_artifact = get_task_by_name(self.graph, buildername) required_elements = ( "--partial-version 37.0", "--locale en-US", "--taskid {}".format(funsize_artifact['taskId']), "--platform {}".format(buildbot2ftp(platform)), "--version 42.0b2", ) @truth def verify_command_requirements(task): command = ''.join(task['task']['payload']['command']) for element in required_elements: if element not in command: return False else: return True return verify_command_requirements
def setUp(self): self.graph_schema = Schema( { 'scopes': generate_scope_validator(scopes={'queue:task-priority:high'}), }, extra=True, required=True) self.test_schema = Schema( { 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'version': '42.0b2', 'build_number': 3, } } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'push_to_candidates_enabled': True, 'checksums_enabled': True, 'updates_enabled': True, 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['foo'], 'final_verify_channels': ['foo'], 'en_US_config': { "platforms": { "macosx64": { "task_id": "abc" }, "win64": { "task_id": "jgh" }, "linux64": { "task_id": "lmn" }, } }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo-firefox_chcksms")
def test_multichannel(self): for chan in ["beta", "release"]: multichan_schema = Schema({ 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'VERIFY_CONFIG': "{chan}-firefox-win32.cfg".format(chan=chan), } } } }, extra=True, required=True) multichan_task = get_task_by_name(self.graph, "release-beta_firefox_win32_update_verify_{chan}_3".format(chan=chan)) verify(multichan_task, multichan_schema, TestBB_UpdateVerifyMultiChannel.not_allowed)
def test_encryption(self): self.task_schema = Schema( { 'task': { 'payload': { 'encryptedEnv': All(Length(2), [ Match(r'^wcB') ]) # Must have 2 elements, starting with wcB } } }, required=True, extra=True) test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'repo_path': 'foo/bar', 'branch': 'mozilla-beta', 'signing_class': 'dep-signing', 'release_channels': ['beta'], 'final_verify_channels': ['beta'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': { "platforms": { "macosx64": { "task_id": "xyz" }, "win32": { "task_id": "xyy" } } }, }) graph = make_task_graph(**test_kwargs) do_common_assertions(graph) for p in ("win32", "macosx64"): for v in ("38.0build1", "37.0build2"): balrog = get_task_by_name( graph, "{}_en-US_{}_funsize_balrog_task".format(p, v)) verify(balrog, self.task_schema)
def setUp(self): self.task_schema = Schema( { 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'build_number': 3, 'repo_path': 'releases/foo', 'script_repo_revision': 'abcd', 'partial_versions': ', '.join([ '37.0build2', '38.0build1', ]), } } } }, required=True, extra=True) test_kwargs = create_firefox_test_args({ 'bouncer_enabled': True, 'release_channels': ['foo'], 'final_verify_channels': ['foo'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': { "platforms": { "macosx64": {}, "win32": {}, "win64": {}, "linux": {}, "linux64": {}, } }, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo_firefox_bncr_sub")
def setUp(self): self.graph_schema = Schema({ 'scopes': generate_scope_validator(scopes={ "queue:task-priority:high", }) }, extra=True, required=True) self.task_schema = Schema({ 'task': { 'provisionerId': 'buildbot-bridge', 'workerType': 'buildbot-bridge', 'payload': { 'properties': { 'repo_path': 'releases/foo', 'script_repo_revision': 'abcd', 'partial_versions': '37.0build2, 38.0build1', 'balrog_api_root': 'https://balrog.real/api', 'platforms': 'linux, linux64, macosx64, win32, win64', 'channels': 'bar, foo', } } } }, extra=True, required=True) test_kwargs = create_firefox_test_args({ 'updates_enabled': True, 'bouncer_enabled': True, 'push_to_candidates_enabled': True, 'postrelease_version_bump_enabled': True, 'updates_builder_enabled': True, 'release_channels': ['foo', 'bar'], 'final_verify_channels': ['foo', 'beta'], 'signing_pvt_key': PVT_KEY_FILE, 'en_US_config': { 'platforms': { 'macosx64': {'task_id': 'abc'}, 'win32': {'task_id': 'def'}, 'win64': {'task_id': 'ghi'}, 'linux': {'task_id': 'jkl'}, 'linux64': {'task_id': 'mno'}, } } }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-foo-firefox_updates")
def setUp(self): test_kwargs = create_firefox_test_args({ 'checksums_enabled': True, 'updates_enabled': True, 'push_to_candidates_enabled': True, 'push_to_releases_enabled': True, 'push_to_releases_automatic': True, 'branch': 'mozilla-beta', 'repo_path': 'releases/mozilla-beta', 'signing_pvt_key': PVT_KEY_FILE, 'release_channels': ['beta', 'release'], 'final_verify_channels': ['beta', 'release'], 'partner_repacks_platforms': [], 'en_US_config': EN_US_CONFIG, 'l10n_config': L10N_CONFIG, }) self.graph = make_task_graph(**test_kwargs) self.task = get_task_by_name(self.graph, "release-{}_{}_push_to_releases".format("mozilla-beta", "firefox"))