[bitbake-devel] [PATCH] toaster: sync release list for Toaster, test, and Layer Index
"Reyna, David" <[email protected]> Thu, 11 Jun 2026 22:57:56 +0000
| Newsgroups | org.openembedded.lists.bitbake-devel |
|---|---|
| Message-ID | <IA1PR11MB767743DDC0B4E26265566228EA1B2@IA1PR11MB7677.namprd11.prod.outlook.com> |
From 21858028a7448ff2d92e388f96da7127cfd7048e Mon Sep 17 00:00:00 2001 From: David Reyna mailto:[email protected] Date: Thu, 11 Jun 2026 14:55:37 -0700 Subject: [PATCH] toaster: sync release list for Toaster, test, and Layer Index Details: * check_fixtures.py: ignore releases not yet in Layer Index (e.g. 'blacksail') * gen_fixtures.py: also sync 'test_create_new_project.py' * test_create_new_project.py: now a generated release list, in slot order * toaster: remove 'exit()' from this sourced script [YOCTO #16280] Signed-off-by: David Reyna mailto:[email protected] --- bin/toaster | 2 +- lib/toaster/orm/fixtures/check_fixtures.py | 55 ++++++++++---- lib/toaster/orm/fixtures/gen_fixtures.py | 74 +++++++++++++++++-- .../functional/test_create_new_project.py | 49 ++++++------ 4 files changed, 133 insertions(+), 47 deletions(-) diff --git a/bin/toaster b/bin/toaster index d20cbe90b..16a64bab6 100755 --- a/bin/toaster +++ b/bin/toaster @@ -236,7 +236,7 @@ for param in $*; do manage_cmd="$manage_cmd $param" else echo "$HELP" - exit 1 + return 1 fi ;; diff --git a/lib/toaster/orm/fixtures/check_fixtures.py b/lib/toaster/orm/fixtures/check_fixtures.py index ae3722e0f..386c2da40 100755 --- a/lib/toaster/orm/fixtures/check_fixtures.py +++ b/lib/toaster/orm/fixtures/check_fixtures.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -# Copyright (C) 2025 Linux Foundation +# Copyright (C) 2026 Linux Foundation # SPDX-License-Identifier: GPL-2.0-only # @@ -10,29 +10,52 @@ import urllib.request import gen_fixtures as fixtures RELEASE_URL = https://dashboard.yoctoproject.org/releases.json +LAYER_INDEX_URL = https://layers.openembedded.org/layerindex/api/branches/ + +# Load a JSON file via REST +def fetch_json(url): + with urllib.request.urlopen(url) as response: + if response.getcode() == 200: + data = response.read().decode("utf-8") + return(json.loads(data)) + else: + print("Couldn't access %s: %s" % (url, reponse.getcode())) + exit(1) + +# Grab the existing release branches in the Layer Index +branches = fetch_json(LAYER_INDEX_URL) +index_branches = [ + e["name"].lower() for e in branches +] -with urllib.request.urlopen(RELEASE_URL) as response: - if response.getcode() == 200: - data = response.read().decode("utf-8") - releases = json.loads(data) +# Grab the recent release branches and add master, so we can ignore old branches +releases = fetch_json(RELEASE_URL) +active_releases = [] +active_but_not_index = [] +for e in releases: + if e["series"] != "current": + continue + release = e["release_codename"].lower() + if not release in index_branches: + active_but_not_index.append(release) else: - print("Couldn't access %s: %s" % (RELEASE_URL, reponse.getcode())) - exit(1) - - -# grab the recent release branches and add master, so we can ignore old branches -active_releases = [ - e["release_codename"].lower() for e in releases if e["series"] == "current" -] + active_releases.append(release) active_releases.append("master") active_releases.append("head") +active_releases.sort() + +if active_but_not_index: + print(f"Note: Active releases that are not yet in the Layer Index: {active_but_not_index}" ) +# Get the list of releases instantiated in the Toaster fixtures fixtures_releases = [x[0].lower() for x in fixtures.current_releases] +fixtures_releases.sort() +# Report the resulting status if set(active_releases) != set(fixtures_releases): - print("WARNING: Active releases don't match toaster configured releases, the difference is: %s" % set(active_releases).difference(set(fixtures_releases))) - print("Active releases: %s" % sorted(active_releases)) - print("Toaster configured releases: %s" % sorted(fixtures_releases)) + print(f"WARNING: Active releases don't match toaster configured releases, the difference is: {set(active_releases).difference(set(fixtures_releases))}") + print(f"Active releases: {sorted(active_releases)}") + print(f"Toaster configured releases: {sorted(fixtures_releases)}") else: print("Success, configuration matches") diff --git a/lib/toaster/orm/fixtures/gen_fixtures.py b/lib/toaster/orm/fixtures/gen_fixtures.py index dda0b8196..937f1ff88 100755 --- a/lib/toaster/orm/fixtures/gen_fixtures.py +++ b/lib/toaster/orm/fixtures/gen_fixtures.py @@ -4,7 +4,7 @@ # # Generate Toaster Fixtures for 'poky.xml' and 'oe-core.xml' # -# Copyright (C) 2022 Wind River Systems +# Copyright (C) 2026 Wind River Systems # SPDX-License-Identifier: GPL-2.0-only # # Edit the 'current_releases' table for each new release cycle @@ -413,6 +413,68 @@ def generate_oe_core(): print_str(epilog_template,fd) fd.close() +################################# +# Update test project list +# + +def generate_test(): + this_path = os.path.dirname(os.path.abspath(__file__)) + test_script = os.path.join(this_path,"../../tests/functional/test_create_new_project.py") + + is_copy = True + out_lines = "" + with open(test_script, 'r') as file_fd: + lines = file_fd.readlines() + for line in lines: + if 'test_create_new_project_without_name' in line: + is_copy = True + out_lines += '\n' + if is_copy: + out_lines += line + if line.startswith('class TestCreateNewProject'): + is_copy = False + # Insert new project entries + + for id,release in enumerate(current_releases): + release_id = id + 1 + release_name = release[0] + release_merge = 'True' + release_version = '' + if 'Master' == release_name: + release_name = 'Master' + release_title = 'Yocto Project master' + release_merge = 'False' + elif 'HEAD' == release_name: + release_name = 'Local' + release_title = 'Local Yocto Project' + else: + release_title = f'Yocto Project {release[1]} "{release_name}"' + release_version = f'{release[1]} ' + # Insert project + test_release_def = f''' + def test_create_new_project_{release_name.lower()}(self): + """ Test create new project using: + - Project Name: Any string + - Release: Yocto Project {release_version}"{release_name}" (option value: {release_id}) + - Merge Toaster settings: {release_merge} + """ + release = '{release_id}' + release_title = '{release_title}' + project_name = 'project{release_name.lower()}' + self.create_new_project( + project_name, + release, + release_title, + {release_merge}, + ) +''' + out_lines += test_release_def + + with open('test_create_new_project.py', 'w') as file_fd: + file_fd.write(out_lines) + print(f"Output: 'test_create_new_project.py'") + os.system(f"mv -f test_create_new_project.py {test_script}") + ################################# # Help # @@ -431,8 +493,9 @@ def main(argv): global verbose parser = argparse.ArgumentParser(description='gen_fixtures.py: table generate the fixture files') - parser.add_argument('--poky', '-p', action='store_const', const='poky', dest='command', help='Generate the poky.xml file') - parser.add_argument('--oe-core', '-o', action='store_const', const='oe_core', dest='command', help='Generate the oe-core.xml file') + parser.add_argument('--poky', '-p', action='store_const', const='poky', dest='command', help="Generate the 'poky.xml' file") + parser.add_argument('--oe-core', '-o', action='store_const', const='oe_core', dest='command', help="Generate the 'oe-core.xml' file") + parser.add_argument('--test', '-t', action='store_const', const='test', dest='command', help="Update the 'test_create_new_project.py' file") parser.add_argument('--all', '-a', action='store_const', const='all', dest='command', help='Generate all fixture files') parser.add_argument('--list', '-l', action='store_const', const='list', dest='command', help='List the release table') parser.add_argument('--verbose', '-v', action='store_true', dest='verbose', help='Enable verbose debugging output') @@ -443,11 +506,12 @@ def main(argv): generate_poky() elif 'oe_core' == args.command: generate_oe_core() + elif 'test' == args.command: + generate_test() elif 'all' == args.command: generate_poky() generate_oe_core() - elif 'all' == args.command: - list_releases() + generate_test() elif 'list' == args.command: list_releases() diff --git a/lib/toaster/tests/functional/test_create_new_project.py b/lib/toaster/tests/functional/test_create_new_project.py index 6e22bdee3..f290f8b3e 100644 --- a/lib/toaster/tests/functional/test_create_new_project.py +++ b/lib/toaster/tests/functional/test_create_new_project.py @@ -15,31 +15,31 @@ from selenium.webdriver.common.by import By class TestCreateNewProject(SeleniumFunctionalTestCase): - def test_create_new_project_master(self): + def test_create_new_project_wrynose(self): """ Test create new project using: - Project Name: Any string - - Release: Yocto Project master (option value: 3) - - Merge Toaster settings: False + - Release: Yocto Project 6.0 "Wrynose" (option value: 1) + - Merge Toaster settings: True """ - release = '3' - release_title = 'Yocto Project master' - project_name = 'projectmaster' + release = '1' + release_title = 'Yocto Project 6.0 "Wrynose"' + project_name = 'projectwrynose' self.create_new_project( project_name, release, release_title, - False, + True, ) - def test_create_new_project_wrynose(self): + def test_create_new_project_local(self): """ Test create new project using: - Project Name: Any string - - Release: Yocto Project 6.0 "Wrynose" (option value: 1) + - Release: Yocto Project "Local" (option value: 2) - Merge Toaster settings: True """ - release = '1' - release_title = 'Yocto Project 6.0 "Wrynose"' - project_name = 'projectwrynose' + release = '2' + release_title = 'Local Yocto Project' + project_name = 'projectlocal' self.create_new_project( project_name, release, @@ -47,32 +47,31 @@ class TestCreateNewProject(SeleniumFunctionalTestCase): True, ) - - def test_create_new_project_scarthgap(self): + def test_create_new_project_master(self): """ Test create new project using: - Project Name: Any string - - Release: Yocto Project 5.0 "Scarthgap" (option value: 4) - - Merge Toaster settings: True + - Release: Yocto Project "Master" (option value: 3) + - Merge Toaster settings: False """ - release = '4' - release_title = 'Yocto Project 5.0 "Scarthgap"' - project_name = 'projectscarthgap' + release = '3' + release_title = 'Yocto Project master' + project_name = 'projectmaster' self.create_new_project( project_name, release, release_title, - True, + False, ) - def test_create_new_project_local(self): + def test_create_new_project_scarthgap(self): """ Test create new project using: - Project Name: Any string - - Release: Local Yocto Project (option value: 2) + - Release: Yocto Project 5.0 "Scarthgap" (option value: 4) - Merge Toaster settings: True """ - release = '2' - release_title = 'Local Yocto Project' - project_name = 'projectlocal' + release = '4' + release_title = 'Yocto Project 5.0 "Scarthgap"' + project_name = 'projectscarthgap' self.create_new_project( project_name, release, -- 2.43.0