diff options
Diffstat (limited to 'bitbake/lib/toaster/orm')
18 files changed, 941 insertions, 233 deletions
diff --git a/bitbake/lib/toaster/orm/fixtures/README b/bitbake/lib/toaster/orm/fixtures/README index 1b1c660aac..7cd745e26b 100644 --- a/bitbake/lib/toaster/orm/fixtures/README +++ b/bitbake/lib/toaster/orm/fixtures/README @@ -27,4 +27,4 @@ Data can be provided in XML, JSON and if installed YAML formats. Use the django management command manage.py loaddata <your fixture file> For further information see the Django command documentation at: -https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-loaddata +https://docs.djangoproject.com/en/3.2/ref/django-admin/#django-admin-loaddata diff --git a/bitbake/lib/toaster/orm/fixtures/gen_fixtures.py b/bitbake/lib/toaster/orm/fixtures/gen_fixtures.py new file mode 100755 index 0000000000..71afe3914e --- /dev/null +++ b/bitbake/lib/toaster/orm/fixtures/gen_fixtures.py @@ -0,0 +1,447 @@ +#!/usr/bin/env python3 +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Generate Toaster Fixtures for 'poky.xml' and 'oe-core.xml' +# +# Copyright (C) 2022 Wind River Systems +# SPDX-License-Identifier: GPL-2.0-only +# +# Edit the 'current_releases' table for each new release cycle +# +# Usage: ./get_fixtures all +# + +import os +import sys +import argparse + +verbose = False + +#################################### +# Releases +# +# https://wiki.yoctoproject.org/wiki/Releases +# +# NOTE: for the current releases table, it helps to keep continuing releases +# in the same table positions since this minimizes the patch diff for review. +# The order of the table does not matter since Toaster presents them sorted. +# +# Traditionally, the two most current releases are included in addition to the +# 'master' branch and the local installation's 'HEAD'. +# It is also policy to include all active LTS releases. +# + +# [Codename, Yocto Project Version, Release Date, Current Version, Support Level, Poky Version, BitBake branch] +current_releases = [ + # Release slot #1 + ['Kirkstone','4.0','April 2022','4.0.8 (March 2023)','Stable - Long Term Support (until Apr. 2024)','','2.0'], + # Release slot #2 'local' + ['HEAD','HEAD','','Local Yocto Project','HEAD','','HEAD'], + # Release slot #3 'master' + ['Master','master','','Yocto Project master','master','','master'], + # Release slot #4 + ['Mickledore','4.2','April 2023','4.2.0 (April 2023)','Support for 7 months (until October 2023)','','2.4'], +# ['Langdale','4.1','October 2022','4.1.2 (January 2023)','Support for 7 months (until May 2023)','','2.2'], +# ['Honister','3.4','October 2021','3.4.2 (February 2022)','Support for 7 months (until May 2022)','26.0','1.52'], +# ['Hardknott','3.3','April 2021','3.3.5 (March 2022)','Stable - Support for 13 months (until Apr. 2022)','25.0','1.50'], +# ['Gatesgarth','3.2','Oct 2020','3.2.4 (May 2021)','EOL','24.0','1.48'], + # Optional Release slot #5 + ['Dunfell','3.1','April 2020','3.1.23 (February 2023)','Stable - Long Term Support (until Apr. 2024)','23.0','1.46'], +] + +default_poky_layers = [ + 'openembedded-core', + 'meta-poky', + 'meta-yocto-bsp', +] + +default_oe_core_layers = [ + 'openembedded-core', +] + +#################################### +# Templates + +prolog_template = '''\ +<?xml version="1.0" encoding="utf-8"?> +<django-objects version="1.0"> + <!-- Set the project default value for DISTRO --> + <object model="orm.toastersetting" pk="1"> + <field type="CharField" name="name">DEFCONF_DISTRO</field> + <field type="CharField" name="value">{{distro}}</field> + </object> +''' + +#<!-- Bitbake versions which correspond to the metadata release -->') +bitbakeversion_poky_template = '''\ + <object model="orm.bitbakeversion" pk="{{bitbake_id}}"> + <field type="CharField" name="name">{{name}}</field> + <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field> + <field type="CharField" name="branch">{{branch}}</field> + <field type="CharField" name="dirpath">bitbake</field> + </object> +''' +bitbakeversion_oecore_template = '''\ + <object model="orm.bitbakeversion" pk="{{bitbake_id}}"> + <field type="CharField" name="name">{{name}}</field> + <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field> + <field type="CharField" name="branch">{{bitbakeversion}}</field> + </object> +''' + +# <!-- Releases available --> +releases_available_template = '''\ + <object model="orm.release" pk="{{ra_count}}"> + <field type="CharField" name="name">{{name}}</field> + <field type="CharField" name="description">{{description}}</field> + <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">{{ra_count}}</field> + <field type="CharField" name="branch_name">{{release}}</field> + <field type="TextField" name="helptext">Toaster will run your builds {{help_source}}.</field> + </object> +''' + +# <!-- Default project layers for each release --> +default_layers_template = '''\ + <object model="orm.releasedefaultlayer" pk="{{rdl_count}}"> + <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field> + <field type="CharField" name="layer_name">{{layer}}</field> + </object> +''' + +default_layers_preface = '''\ + <!-- Default layers provided by poky + openembedded-core + meta-poky + meta-yocto-bsp + --> +''' + +layer_poky_template = '''\ + <object model="orm.layer" pk="{{layer_id}}"> + <field type="CharField" name="name">{{layer}}</field> + <field type="CharField" name="layer_index_url"></field> + <field type="CharField" name="vcs_url">{{vcs_url}}</field> + <field type="CharField" name="vcs_web_url">{{vcs_web_url}}</field> + <field type="CharField" name="vcs_web_tree_base_url">{{vcs_web_tree_base_url}}</field> + <field type="CharField" name="vcs_web_file_base_url">{{vcs_web_file_base_url}}</field> + </object> +''' + +layer_oe_core_template = '''\ + <object model="orm.layer" pk="{{layer_id}}"> + <field type="CharField" name="name">{{layer}}</field> + <field type="CharField" name="vcs_url">{{vcs_url}}</field> + <field type="CharField" name="vcs_web_url">{{vcs_web_url}}</field> + <field type="CharField" name="vcs_web_tree_base_url">{{vcs_web_tree_base_url}}</field> + <field type="CharField" name="vcs_web_file_base_url">{{vcs_web_file_base_url}}</field> + </object> +''' + +layer_version_template = '''\ + <object model="orm.layer_version" pk="{{lv_count}}"> + <field rel="ManyToOneRel" to="orm.layer" name="layer">{{layer_id}}</field> + <field type="IntegerField" name="layer_source">0</field> + <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field> + <field type="CharField" name="branch">{{branch}}</field> + <field type="CharField" name="dirpath">{{dirpath}}</field> + </object> +''' + +layer_version_HEAD_template = '''\ + <object model="orm.layer_version" pk="{{lv_count}}"> + <field rel="ManyToOneRel" to="orm.layer" name="layer">{{layer_id}}</field> + <field type="IntegerField" name="layer_source">0</field> + <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field> + <field type="CharField" name="branch">{{branch}}</field> + <field type="CharField" name="commit">{{commit}}</field> + <field type="CharField" name="dirpath">{{dirpath}}</field> + </object> +''' + +layer_version_oe_core_template = '''\ + <object model="orm.layer_version" pk="1"> + <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field> + <field rel="ManyToOneRel" to="orm.release" name="release">2</field> + <field type="CharField" name="local_path">OE-CORE-LAYER-DIR</field> + <field type="CharField" name="branch">HEAD</field> + <field type="CharField" name="dirpath">meta</field> + <field type="IntegerField" name="layer_source">0</field> + </object> +''' + +epilog_template = '''\ +</django-objects> +''' + +################################# +# Helper Routines +# + +def print_str(str,fd): + # Avoid extra newline at end + if str and (str[-1] == '\n'): + str = str[0:-1] + print(str,file=fd) + +def print_template(template,params,fd): + for line in template.split('\n'): + p = line.find('{{') + while p > 0: + q = line.find('}}') + key = line[p+2:q] + if key in params: + line = line[0:p] + params[key] + line[q+2:] + else: + line = line[0:p] + '?' + key + '?' + line[q+2:] + p = line.find('{{') + if line: + print(line,file=fd) + +################################# +# Generate poky.xml +# + +def generate_poky(): + fd = open('poky.xml','w') + + params = {} + params['distro'] = 'poky' + print_template(prolog_template,params,fd) + print_str('',fd) + + print_str(' <!-- Bitbake versions which correspond to the metadata release -->',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): # 'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['name'] = params['release'] + params['bitbake_id'] = str(i+1) + params['branch'] = params['release'] + print_template(bitbakeversion_poky_template,params,fd) + print_str('',fd) + + print_str('',fd) + print_str(' <!-- Releases available -->',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): #'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['h_release'] = '?h={{release}}' + params['name'] = params['release'] + params['ra_count'] = str(i+1) + params['branch'] = params['release'] + + if 'HEAD' == params['release']: + params['help_source'] = 'with the version of the Yocto Project you have cloned or downloaded to your computer' + params['description'] = 'Local Yocto Project' + params['name'] = 'local' + else: + params['help_source'] = 'using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/{{h_release}}">Yocto Project {{Release}} branch</a>' + params['description'] = 'Yocto Project {{release_version}} "{{Release}}"' + if 'master' == params['release']: + params['h_release'] = '' + params['description'] = 'Yocto Project master' + + print_template(releases_available_template,params,fd) + print_str('',fd) + + print_str(' <!-- Default project layers for each release -->',fd) + rdl_count = 1 + for i,release in enumerate(current_releases): + for j,layer in enumerate(default_poky_layers): + params = {} + params['layer'] = layer + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('master','HEAD')): + params['release'] = params['release'][0].lower() + params['release'][1:] + params['release_id'] = str(i+1) + params['rdl_count'] = str(rdl_count) + params['branch'] = params['release'] + print_template(default_layers_template,params,fd) + rdl_count += 1 + print_str('',fd) + + print_str(default_layers_preface,fd) + lv_count = 1 + for i,layer in enumerate(default_poky_layers): + params = {} + params['layer'] = layer + params['layer_id'] = str(i+1) + params['vcs_url'] = 'git://git.yoctoproject.org/poky' + params['vcs_web_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky' + params['vcs_web_tree_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%' + params['vcs_web_file_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%' + + if i: + print_str('',fd) + print_template(layer_poky_template,params,fd) + for j,release in enumerate(current_releases): + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('master','HEAD')): + params['release'] = params['release'][0].lower() + params['release'][1:] + params['release_id'] = str(j+1) + params['lv_count'] = str(lv_count) + params['branch'] = params['release'] + params['commit'] = params['release'] + + params['dirpath'] = params['layer'] + if params['layer'] in ('openembedded-core'): #'openembedded-core', + params['dirpath'] = 'meta' + + if 'HEAD' == params['release']: + print_template(layer_version_HEAD_template,params,fd) + else: + print_template(layer_version_template,params,fd) + lv_count += 1 + + print_str(epilog_template,fd) + fd.close() + +################################# +# Generate oe-core.xml +# + +def generate_oe_core(): + fd = open('oe-core.xml','w') + + params = {} + params['distro'] = 'nodistro' + print_template(prolog_template,params,fd) + print_str('',fd) + + print_str(' <!-- Bitbake versions which correspond to the metadata release -->',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['bitbakeversion'] = release[6] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): # 'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['name'] = params['release'] + params['bitbake_id'] = str(i+1) + params['branch'] = params['release'] + print_template(bitbakeversion_oecore_template,params,fd) + print_str('',fd) + + print_str(' <!-- Releases available -->',fd) + for i,release in enumerate(current_releases): + params = {} + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('HEAD')): #'master', + params['release'] = params['release'][0].lower() + params['release'][1:] + params['h_release'] = '?h={{release}}' + params['name'] = params['release'] + params['ra_count'] = str(i+1) + params['branch'] = params['release'] + + if 'HEAD' == params['release']: + params['help_source'] = 'with the version of OpenEmbedded that you have cloned or downloaded to your computer' + params['description'] = 'Local Openembedded' + params['name'] = 'local' + else: + params['help_source'] = 'using the tip of the <a href=\\"https://cgit.openembedded.org/openembedded-core/log/{{h_release}}\\">OpenEmbedded {{Release}}</a> branch' + params['description'] = 'Openembedded {{Release}}' + if 'master' == params['release']: + params['h_release'] = '' + params['description'] = 'OpenEmbedded core master' + params['Release'] = params['release'] + + print_template(releases_available_template,params,fd) + print_str('',fd) + + print_str(' <!-- Default layers for each release -->',fd) + rdl_count = 1 + for i,release in enumerate(current_releases): + for j,layer in enumerate(default_oe_core_layers): + params = {} + params['layer'] = layer + params['release'] = release[0] + params['Release'] = release[0] + params['release_version'] = release[1] + if not (params['release'] in ('master','HEAD')): + params['release'] = params['release'][0].lower() + params['release'][1:] + params['release_id'] = str(i+1) + params['rdl_count'] = str(rdl_count) + params['branch'] = params['release'] + print_template(default_layers_template,params,fd) + rdl_count += 1 + print_str('',fd) + + print_str('',fd) + print_str(' <!-- Layer for the Local release -->',fd) + lv_count = 1 + for i,layer in enumerate(default_oe_core_layers): + params = {} + params['layer'] = layer + params['layer_id'] = str(i+1) + params['vcs_url'] = 'git://git.openembedded.org/openembedded-core' + params['vcs_web_url'] = 'https://cgit.openembedded.org/openembedded-core' + params['vcs_web_tree_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%' + params['vcs_web_file_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%' + if i: + print_str('',fd) + print_template(layer_oe_core_template,params,fd) + + print_template(layer_version_oe_core_template,params,fd) + print_str('',fd) + + print_str(epilog_template,fd) + fd.close() + +################################# +# Help +# + +def list_releases(): + print("Release ReleaseVer BitbakeVer Support Level") + print("========== =========== ========== ==============================================") + for release in current_releases: + print("%10s %10s %11s %s" % (release[0],release[1],release[6],release[4])) + +################################# +# main +# + +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('--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') + args = parser.parse_args() + + verbose = args.verbose + if 'poky' == args.command: + generate_poky() + elif 'oe_core' == args.command: + generate_oe_core() + elif 'all' == args.command: + generate_poky() + generate_oe_core() + elif 'all' == args.command: + list_releases() + elif 'list' == args.command: + list_releases() + + else: + print("No command for 'gen_fixtures.py' selected") + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/bitbake/lib/toaster/orm/fixtures/oe-core.xml b/bitbake/lib/toaster/orm/fixtures/oe-core.xml index fec93aba1e..950f2a98af 100644 --- a/bitbake/lib/toaster/orm/fixtures/oe-core.xml +++ b/bitbake/lib/toaster/orm/fixtures/oe-core.xml @@ -8,9 +8,9 @@ <!-- Bitbake versions which correspond to the metadata release --> <object model="orm.bitbakeversion" pk="1"> - <field type="CharField" name="name">sumo</field> + <field type="CharField" name="name">kirkstone</field> <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field> - <field type="CharField" name="branch">1.38</field> + <field type="CharField" name="branch">2.0</field> </object> <object model="orm.bitbakeversion" pk="2"> <field type="CharField" name="name">HEAD</field> @@ -23,18 +23,23 @@ <field type="CharField" name="branch">master</field> </object> <object model="orm.bitbakeversion" pk="4"> - <field type="CharField" name="name">thud</field> + <field type="CharField" name="name">mickledore</field> <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field> - <field type="CharField" name="branch">1.40</field> + <field type="CharField" name="branch">2.4</field> + </object> + <object model="orm.bitbakeversion" pk="5"> + <field type="CharField" name="name">dunfell</field> + <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field> + <field type="CharField" name="branch">1.46</field> </object> <!-- Releases available --> <object model="orm.release" pk="1"> - <field type="CharField" name="name">sumo</field> - <field type="CharField" name="description">Openembedded Sumo</field> + <field type="CharField" name="name">kirkstone</field> + <field type="CharField" name="description">Openembedded Kirkstone</field> <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">1</field> - <field type="CharField" name="branch_name">sumo</field> - <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=sumo\">OpenEmbedded Sumo</a> branch.</field> + <field type="CharField" name="branch_name">kirkstone</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"https://cgit.openembedded.org/openembedded-core/log/?h=kirkstone\">OpenEmbedded Kirkstone</a> branch.</field> </object> <object model="orm.release" pk="2"> <field type="CharField" name="name">local</field> @@ -48,14 +53,21 @@ <field type="CharField" name="description">OpenEmbedded core master</field> <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">3</field> <field type="CharField" name="branch_name">master</field> - <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/\">OpenEmbedded master</a> branch.</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"https://cgit.openembedded.org/openembedded-core/log/\">OpenEmbedded master</a> branch.</field> </object> <object model="orm.release" pk="4"> - <field type="CharField" name="name">thud</field> - <field type="CharField" name="description">Openembedded Rocko</field> - <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">1</field> - <field type="CharField" name="branch_name">thud</field> - <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=thud\">OpenEmbedded Thud</a> branch.</field> + <field type="CharField" name="name">mickledore</field> + <field type="CharField" name="description">Openembedded Mickledore</field> + <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">4</field> + <field type="CharField" name="branch_name">mickledore</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"https://cgit.openembedded.org/openembedded-core/log/?h=mickledore\">OpenEmbedded Mickledore</a> branch.</field> + </object> + <object model="orm.release" pk="5"> + <field type="CharField" name="name">dunfell</field> + <field type="CharField" name="description">Openembedded Dunfell</field> + <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">5</field> + <field type="CharField" name="branch_name">dunfell</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href=\"https://cgit.openembedded.org/openembedded-core/log/?h=dunfell\">OpenEmbedded Dunfell</a> branch.</field> </object> <!-- Default layers for each release --> @@ -75,15 +87,19 @@ <field rel="ManyToOneRel" to="orm.release" name="release">4</field> <field type="CharField" name="layer_name">openembedded-core</field> </object> + <object model="orm.releasedefaultlayer" pk="5"> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="layer_name">openembedded-core</field> + </object> <!-- Layer for the Local release --> <object model="orm.layer" pk="1"> <field type="CharField" name="name">openembedded-core</field> <field type="CharField" name="vcs_url">git://git.openembedded.org/openembedded-core</field> - <field type="CharField" name="vcs_web_url">http://cgit.openembedded.org/openembedded-core</field> - <field type="CharField" name="vcs_web_tree_base_url">http://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%</field> - <field type="CharField" name="vcs_web_file_base_url">http://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_url">https://cgit.openembedded.org/openembedded-core</field> + <field type="CharField" name="vcs_web_tree_base_url">https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_file_base_url">https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%</field> </object> <object model="orm.layer_version" pk="1"> <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field> diff --git a/bitbake/lib/toaster/orm/fixtures/poky.xml b/bitbake/lib/toaster/orm/fixtures/poky.xml index fb9a771884..121e52fd45 100644 --- a/bitbake/lib/toaster/orm/fixtures/poky.xml +++ b/bitbake/lib/toaster/orm/fixtures/poky.xml @@ -8,9 +8,9 @@ <!-- Bitbake versions which correspond to the metadata release --> <object model="orm.bitbakeversion" pk="1"> - <field type="CharField" name="name">sumo</field> + <field type="CharField" name="name">kirkstone</field> <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field> - <field type="CharField" name="branch">sumo</field> + <field type="CharField" name="branch">kirkstone</field> <field type="CharField" name="dirpath">bitbake</field> </object> <object model="orm.bitbakeversion" pk="2"> @@ -26,20 +26,26 @@ <field type="CharField" name="dirpath">bitbake</field> </object> <object model="orm.bitbakeversion" pk="4"> - <field type="CharField" name="name">thud</field> + <field type="CharField" name="name">mickledore</field> <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field> - <field type="CharField" name="branch">thud</field> + <field type="CharField" name="branch">mickledore</field> + <field type="CharField" name="dirpath">bitbake</field> + </object> + <object model="orm.bitbakeversion" pk="5"> + <field type="CharField" name="name">dunfell</field> + <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field> + <field type="CharField" name="branch">dunfell</field> <field type="CharField" name="dirpath">bitbake</field> </object> <!-- Releases available --> <object model="orm.release" pk="1"> - <field type="CharField" name="name">sumo</field> - <field type="CharField" name="description">Yocto Project 2.5 "Sumo"</field> + <field type="CharField" name="name">kirkstone</field> + <field type="CharField" name="description">Yocto Project 4.0 "Kirkstone"</field> <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">1</field> - <field type="CharField" name="branch_name">sumo</field> - <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=sumo">Yocto Project Sumo branch</a>.</field> + <field type="CharField" name="branch_name">kirkstone</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=kirkstone">Yocto Project Kirkstone branch</a>.</field> </object> <object model="orm.release" pk="2"> <field type="CharField" name="name">local</field> @@ -53,14 +59,21 @@ <field type="CharField" name="description">Yocto Project master</field> <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">3</field> <field type="CharField" name="branch_name">master</field> - <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/">Yocto Project Master branch</a>.</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/">Yocto Project Master branch</a>.</field> </object> <object model="orm.release" pk="4"> - <field type="CharField" name="name">rocko</field> - <field type="CharField" name="description">Yocto Project 2.6 "Thud"</field> - <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">1</field> - <field type="CharField" name="branch_name">thud</field> - <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=thud">Yocto Project Thud branch</a>.</field> + <field type="CharField" name="name">mickledore</field> + <field type="CharField" name="description">Yocto Project 4.2 "Mickledore"</field> + <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">4</field> + <field type="CharField" name="branch_name">mickledore</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=mickledore">Yocto Project Mickledore branch</a>.</field> + </object> + <object model="orm.release" pk="5"> + <field type="CharField" name="name">dunfell</field> + <field type="CharField" name="description">Yocto Project 3.1 "Dunfell"</field> + <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">5</field> + <field type="CharField" name="branch_name">dunfell</field> + <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=dunfell">Yocto Project Dunfell branch</a>.</field> </object> <!-- Default project layers for each release --> @@ -112,6 +125,18 @@ <field rel="ManyToOneRel" to="orm.release" name="release">4</field> <field type="CharField" name="layer_name">meta-yocto-bsp</field> </object> + <object model="orm.releasedefaultlayer" pk="13"> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="layer_name">openembedded-core</field> + </object> + <object model="orm.releasedefaultlayer" pk="14"> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="layer_name">meta-poky</field> + </object> + <object model="orm.releasedefaultlayer" pk="15"> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="layer_name">meta-yocto-bsp</field> + </object> <!-- Default layers provided by poky openembedded-core @@ -122,15 +147,15 @@ <field type="CharField" name="name">openembedded-core</field> <field type="CharField" name="layer_index_url"></field> <field type="CharField" name="vcs_url">git://git.yoctoproject.org/poky</field> - <field type="CharField" name="vcs_web_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky</field> - <field type="CharField" name="vcs_web_tree_base_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> - <field type="CharField" name="vcs_web_file_base_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky</field> + <field type="CharField" name="vcs_web_tree_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_file_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> </object> <object model="orm.layer_version" pk="1"> <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">1</field> - <field type="CharField" name="branch">sumo</field> + <field type="CharField" name="branch">kirkstone</field> <field type="CharField" name="dirpath">meta</field> </object> <object model="orm.layer_version" pk="2"> @@ -152,7 +177,14 @@ <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">4</field> - <field type="CharField" name="branch">rocko</field> + <field type="CharField" name="branch">mickledore</field> + <field type="CharField" name="dirpath">meta</field> + </object> + <object model="orm.layer_version" pk="5"> + <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field> + <field type="IntegerField" name="layer_source">0</field> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="branch">dunfell</field> <field type="CharField" name="dirpath">meta</field> </object> @@ -160,18 +192,18 @@ <field type="CharField" name="name">meta-poky</field> <field type="CharField" name="layer_index_url"></field> <field type="CharField" name="vcs_url">git://git.yoctoproject.org/poky</field> - <field type="CharField" name="vcs_web_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky</field> - <field type="CharField" name="vcs_web_tree_base_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> - <field type="CharField" name="vcs_web_file_base_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky</field> + <field type="CharField" name="vcs_web_tree_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_file_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> </object> - <object model="orm.layer_version" pk="5"> + <object model="orm.layer_version" pk="6"> <field rel="ManyToOneRel" to="orm.layer" name="layer">2</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">1</field> - <field type="CharField" name="branch">sumo</field> + <field type="CharField" name="branch">kirkstone</field> <field type="CharField" name="dirpath">meta-poky</field> </object> - <object model="orm.layer_version" pk="6"> + <object model="orm.layer_version" pk="7"> <field rel="ManyToOneRel" to="orm.layer" name="layer">2</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">2</field> @@ -179,18 +211,25 @@ <field type="CharField" name="commit">HEAD</field> <field type="CharField" name="dirpath">meta-poky</field> </object> - <object model="orm.layer_version" pk="7"> + <object model="orm.layer_version" pk="8"> <field rel="ManyToOneRel" to="orm.layer" name="layer">2</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">3</field> <field type="CharField" name="branch">master</field> <field type="CharField" name="dirpath">meta-poky</field> </object> - <object model="orm.layer_version" pk="8"> + <object model="orm.layer_version" pk="9"> <field rel="ManyToOneRel" to="orm.layer" name="layer">2</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">4</field> - <field type="CharField" name="branch">rocko</field> + <field type="CharField" name="branch">mickledore</field> + <field type="CharField" name="dirpath">meta-poky</field> + </object> + <object model="orm.layer_version" pk="10"> + <field rel="ManyToOneRel" to="orm.layer" name="layer">2</field> + <field type="IntegerField" name="layer_source">0</field> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="branch">dunfell</field> <field type="CharField" name="dirpath">meta-poky</field> </object> @@ -198,18 +237,18 @@ <field type="CharField" name="name">meta-yocto-bsp</field> <field type="CharField" name="layer_index_url"></field> <field type="CharField" name="vcs_url">git://git.yoctoproject.org/poky</field> - <field type="CharField" name="vcs_web_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky</field> - <field type="CharField" name="vcs_web_tree_base_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> - <field type="CharField" name="vcs_web_file_base_url">http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky</field> + <field type="CharField" name="vcs_web_tree_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> + <field type="CharField" name="vcs_web_file_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field> </object> - <object model="orm.layer_version" pk="9"> + <object model="orm.layer_version" pk="11"> <field rel="ManyToOneRel" to="orm.layer" name="layer">3</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">1</field> - <field type="CharField" name="branch">sumo</field> + <field type="CharField" name="branch">kirkstone</field> <field type="CharField" name="dirpath">meta-yocto-bsp</field> </object> - <object model="orm.layer_version" pk="10"> + <object model="orm.layer_version" pk="12"> <field rel="ManyToOneRel" to="orm.layer" name="layer">3</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">2</field> @@ -217,18 +256,25 @@ <field type="CharField" name="commit">HEAD</field> <field type="CharField" name="dirpath">meta-yocto-bsp</field> </object> - <object model="orm.layer_version" pk="11"> + <object model="orm.layer_version" pk="13"> <field rel="ManyToOneRel" to="orm.layer" name="layer">3</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">3</field> <field type="CharField" name="branch">master</field> <field type="CharField" name="dirpath">meta-yocto-bsp</field> </object> - <object model="orm.layer_version" pk="12"> + <object model="orm.layer_version" pk="14"> <field rel="ManyToOneRel" to="orm.layer" name="layer">3</field> <field type="IntegerField" name="layer_source">0</field> <field rel="ManyToOneRel" to="orm.release" name="release">4</field> - <field type="CharField" name="branch">rocko</field> + <field type="CharField" name="branch">mickledore</field> + <field type="CharField" name="dirpath">meta-yocto-bsp</field> + </object> + <object model="orm.layer_version" pk="15"> + <field rel="ManyToOneRel" to="orm.layer" name="layer">3</field> + <field type="IntegerField" name="layer_source">0</field> + <field rel="ManyToOneRel" to="orm.release" name="release">5</field> + <field type="CharField" name="branch">dunfell</field> <field type="CharField" name="dirpath">meta-yocto-bsp</field> </object> </django-objects> diff --git a/bitbake/lib/toaster/orm/fixtures/settings.xml b/bitbake/lib/toaster/orm/fixtures/settings.xml index 78c0fdca7f..02c26a6974 100644 --- a/bitbake/lib/toaster/orm/fixtures/settings.xml +++ b/bitbake/lib/toaster/orm/fixtures/settings.xml @@ -12,14 +12,14 @@ </object> <object model="orm.toastersetting" pk="4"> <field type="CharField" name="name">DEFCONF_MACHINE</field> - <field type="CharField" name="value">qemux86</field> + <field type="CharField" name="value">qemux86-64</field> </object> <object model="orm.toastersetting" pk="5"> <field type="CharField" name="name">DEFCONF_SSTATE_DIR</field> <field type="CharField" name="value">${TOPDIR}/../sstate-cache</field> </object> <object model="orm.toastersetting" pk="6"> - <field type="CharField" name="name">DEFCONF_IMAGE_INSTALL_append</field> + <field type="CharField" name="name">DEFCONF_IMAGE_INSTALL:append</field> <field type="CharField" name="value"></field> </object> <object model="orm.toastersetting" pk="7"> diff --git a/bitbake/lib/toaster/orm/management/commands/lsupdates.py b/bitbake/lib/toaster/orm/management/commands/lsupdates.py index 66114ff89e..6d64830ebd 100644 --- a/bitbake/lib/toaster/orm/management/commands/lsupdates.py +++ b/bitbake/lib/toaster/orm/management/commands/lsupdates.py @@ -1,27 +1,14 @@ # -# ex:ts=4:sw=4:sts=4:et -# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -# # BitBake Toaster Implementation # # Copyright (C) 2016-2017 Intel Corporation # -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# SPDX-License-Identifier: GPL-2.0-only # -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from django.core.management.base import BaseCommand -from orm.models import LayerSource, Layer, Release, Layer_Version +from orm.models import Layer, Release, Layer_Version from orm.models import LayerVersionDependency, Machine, Recipe from orm.models import Distro from orm.models import ToasterSetting @@ -34,7 +21,7 @@ import threading import time logger = logging.getLogger("toaster") -DEFAULT_LAYERINDEX_SERVER = "http://layers.openembedded.org/layerindex/api/" +DEFAULT_LAYERINDEX_SERVER = "https://layers.openembedded.org/layerindex/api/" # Add path to bitbake modules for layerindexlib # lib/toaster/orm/management/commands/lsupdates.py (abspath) @@ -53,7 +40,7 @@ class Spinner(threading.Thread): """ A simple progress spinner to indicate download/parsing is happening""" def __init__(self, *args, **kwargs): super(Spinner, self).__init__(*args, **kwargs) - self.setDaemon(True) + self.daemon = True self.signal = True def run(self): @@ -81,7 +68,7 @@ class Command(BaseCommand): (what, pec)) sys.stdout.flush() - if int(pec) is 100: + if int(pec) == 100: sys.stdout.write("\n") sys.stdout.flush() @@ -100,13 +87,13 @@ class Command(BaseCommand): # update branches; only those that we already have names listed in the # Releases table - whitelist_branch_names = [rel.branch_name - for rel in Release.objects.all()] - if len(whitelist_branch_names) == 0: + allowed_branch_names = [rel.branch_name + for rel in Release.objects.all()] + if len(allowed_branch_names) == 0: raise Exception("Failed to make list of branches to fetch") logger.info("Fetching metadata for %s", - " ".join(whitelist_branch_names)) + " ".join(allowed_branch_names)) # We require a non-empty bb.data, but we can fake it with a dictionary layerindex = layerindexlib.LayerIndex({"DUMMY" : "VALUE"}) @@ -114,8 +101,8 @@ class Command(BaseCommand): http_progress = Spinner() http_progress.start() - if whitelist_branch_names: - url_branches = ";branch=%s" % ','.join(whitelist_branch_names) + if allowed_branch_names: + url_branches = ";branch=%s" % ','.join(allowed_branch_names) else: url_branches = "" layerindex.load_layerindex("%s%s" % (self.apiurl, url_branches)) diff --git a/bitbake/lib/toaster/orm/migrations/0001_initial.py b/bitbake/lib/toaster/orm/migrations/0001_initial.py index 760462f6b4..a8ac23bfc7 100644 --- a/bitbake/lib/toaster/orm/migrations/0001_initial.py +++ b/bitbake/lib/toaster/orm/migrations/0001_initial.py @@ -54,7 +54,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('build', models.ForeignKey(to='orm.Build')), + ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -64,7 +64,7 @@ class Migration(migrations.Migration): ('area', models.IntegerField(choices=[(0, b'variable')])), ('key', models.CharField(max_length=100)), ('text', models.TextField()), - ('build', models.ForeignKey(related_name='helptext_build', to='orm.Build')), + ('build', models.ForeignKey(related_name='helptext_build', to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -94,8 +94,8 @@ class Migration(migrations.Migration): ('dirpath', models.CharField(default=None, max_length=255, null=True)), ('priority', models.IntegerField(default=0)), ('local_path', models.FilePathField(default=b'/', max_length=1024)), - ('build', models.ForeignKey(related_name='layer_version_build', default=None, to='orm.Build', null=True)), - ('layer', models.ForeignKey(related_name='layer_version_layer', to='orm.Layer')), + ('build', models.ForeignKey(related_name='layer_version_build', default=None, to='orm.Build', null=True, on_delete=models.CASCADE)), + ('layer', models.ForeignKey(related_name='layer_version_layer', to='orm.Layer', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -112,9 +112,9 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('up_id', models.IntegerField(default=None, null=True)), - ('depends_on', models.ForeignKey(related_name='dependees', to='orm.Layer_Version')), - ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)), - ('layer_version', models.ForeignKey(related_name='dependencies', to='orm.Layer_Version')), + ('depends_on', models.ForeignKey(related_name='dependees', to='orm.Layer_Version', on_delete=models.CASCADE)), + ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)), + ('layer_version', models.ForeignKey(related_name='dependencies', to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -125,7 +125,7 @@ class Migration(migrations.Migration): ('message', models.TextField(null=True, blank=True)), ('pathname', models.FilePathField(max_length=255, blank=True)), ('lineno', models.IntegerField(null=True)), - ('build', models.ForeignKey(to='orm.Build')), + ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -136,8 +136,8 @@ class Migration(migrations.Migration): ('up_date', models.DateTimeField(default=None, null=True)), ('name', models.CharField(max_length=255)), ('description', models.CharField(max_length=255)), - ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)), - ('layer_version', models.ForeignKey(to='orm.Layer_Version')), + ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)), + ('layer_version', models.ForeignKey(to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -154,7 +154,7 @@ class Migration(migrations.Migration): ('installed_size', models.IntegerField(default=0)), ('section', models.CharField(max_length=80, blank=True)), ('license', models.CharField(max_length=80, blank=True)), - ('build', models.ForeignKey(to='orm.Build', null=True)), + ('build', models.ForeignKey(to='orm.Build', null=True, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -162,8 +162,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'depends'), (3, b'recommends'), (2, b'recommends'), (4, b'suggests'), (5, b'provides'), (6, b'replaces'), (7, b'conflicts')])), - ('depends_on', models.ForeignKey(related_name='package_dependencies_target', to='orm.Package')), - ('package', models.ForeignKey(related_name='package_dependencies_source', to='orm.Package')), + ('depends_on', models.ForeignKey(related_name='package_dependencies_target', to='orm.Package', on_delete=models.CASCADE)), + ('package', models.ForeignKey(related_name='package_dependencies_source', to='orm.Package', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -172,7 +172,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('path', models.FilePathField(max_length=255, blank=True)), ('size', models.IntegerField()), - ('package', models.ForeignKey(related_name='buildfilelist_package', to='orm.Package')), + ('package', models.ForeignKey(related_name='buildfilelist_package', to='orm.Package', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -185,7 +185,7 @@ class Migration(migrations.Migration): ('updated', models.DateTimeField(auto_now=True)), ('user_id', models.IntegerField(null=True)), ('is_default', models.BooleanField(default=False)), - ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', null=True)), + ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', null=True, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -193,8 +193,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('optional', models.BooleanField(default=True)), - ('layercommit', models.ForeignKey(to='orm.Layer_Version', null=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('layercommit', models.ForeignKey(to='orm.Layer_Version', null=True, on_delete=models.CASCADE)), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -203,7 +203,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('target', models.CharField(max_length=100)), ('task', models.CharField(max_length=100, null=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -212,7 +212,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100)), ('value', models.TextField(blank=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -232,8 +232,8 @@ class Migration(migrations.Migration): ('file_path', models.FilePathField(max_length=255)), ('pathflags', models.CharField(max_length=200, blank=True)), ('is_image', models.BooleanField(default=False)), - ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)), - ('layer_version', models.ForeignKey(related_name='recipe_layer_version', to='orm.Layer_Version')), + ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)), + ('layer_version', models.ForeignKey(related_name='recipe_layer_version', to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -241,8 +241,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'rdepends')])), - ('depends_on', models.ForeignKey(related_name='r_dependencies_depends', to='orm.Recipe')), - ('recipe', models.ForeignKey(related_name='r_dependencies_recipe', to='orm.Recipe')), + ('depends_on', models.ForeignKey(related_name='r_dependencies_depends', to='orm.Recipe', on_delete=models.CASCADE)), + ('recipe', models.ForeignKey(related_name='r_dependencies_recipe', to='orm.Recipe', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -253,7 +253,7 @@ class Migration(migrations.Migration): ('description', models.CharField(max_length=255)), ('branch_name', models.CharField(default=b'', max_length=50)), ('helptext', models.TextField(null=True)), - ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion')), + ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -261,7 +261,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('layer_name', models.CharField(default=b'', max_length=100)), - ('release', models.ForeignKey(to='orm.Release')), + ('release', models.ForeignKey(to='orm.Release', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -269,8 +269,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('priority', models.IntegerField(default=0)), - ('layer_source', models.ForeignKey(to='orm.LayerSource')), - ('release', models.ForeignKey(to='orm.Release')), + ('layer_source', models.ForeignKey(to='orm.LayerSource', on_delete=models.CASCADE)), + ('release', models.ForeignKey(to='orm.Release', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -282,7 +282,7 @@ class Migration(migrations.Migration): ('is_image', models.BooleanField(default=False)), ('image_size', models.IntegerField(default=0)), ('license_manifest_path', models.CharField(max_length=500, null=True)), - ('build', models.ForeignKey(to='orm.Build')), + ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -295,9 +295,9 @@ class Migration(migrations.Migration): ('permission', models.CharField(max_length=16)), ('owner', models.CharField(max_length=128)), ('group', models.CharField(max_length=128)), - ('directory', models.ForeignKey(related_name='directory_set', to='orm.Target_File', null=True)), - ('sym_target', models.ForeignKey(related_name='symlink_set', to='orm.Target_File', null=True)), - ('target', models.ForeignKey(to='orm.Target')), + ('directory', models.ForeignKey(related_name='directory_set', to='orm.Target_File', null=True, on_delete=models.CASCADE)), + ('sym_target', models.ForeignKey(related_name='symlink_set', to='orm.Target_File', null=True, on_delete=models.CASCADE)), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -306,15 +306,15 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('file_name', models.FilePathField(max_length=254)), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to='orm.Target')), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( name='Target_Installed_Package', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('package', models.ForeignKey(related_name='buildtargetlist_package', to='orm.Package')), - ('target', models.ForeignKey(to='orm.Target')), + ('package', models.ForeignKey(related_name='buildtargetlist_package', to='orm.Package', on_delete=models.CASCADE)), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -337,8 +337,8 @@ class Migration(migrations.Migration): ('sstate_result', models.IntegerField(default=0, choices=[(0, b'Not Applicable'), (1, b'File not in cache'), (2, b'Failed'), (3, b'Succeeded')])), ('message', models.CharField(max_length=240)), ('logfile', models.FilePathField(max_length=255, blank=True)), - ('build', models.ForeignKey(related_name='task_build', to='orm.Build')), - ('recipe', models.ForeignKey(related_name='tasks', to='orm.Recipe')), + ('build', models.ForeignKey(related_name='task_build', to='orm.Build', on_delete=models.CASCADE)), + ('recipe', models.ForeignKey(related_name='tasks', to='orm.Recipe', on_delete=models.CASCADE)), ], options={ 'ordering': ('order', 'recipe'), @@ -348,8 +348,8 @@ class Migration(migrations.Migration): name='Task_Dependency', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('depends_on', models.ForeignKey(related_name='task_dependencies_depends', to='orm.Task')), - ('task', models.ForeignKey(related_name='task_dependencies_task', to='orm.Task')), + ('depends_on', models.ForeignKey(related_name='task_dependencies_depends', to='orm.Task', on_delete=models.CASCADE)), + ('task', models.ForeignKey(related_name='task_dependencies_task', to='orm.Task', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -370,7 +370,7 @@ class Migration(migrations.Migration): ('changed', models.BooleanField(default=False)), ('human_readable_name', models.CharField(max_length=200)), ('description', models.TextField(blank=True)), - ('build', models.ForeignKey(related_name='variable_build', to='orm.Build')), + ('build', models.ForeignKey(related_name='variable_build', to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -381,28 +381,28 @@ class Migration(migrations.Migration): ('file_name', models.FilePathField(max_length=255)), ('line_number', models.IntegerField(null=True)), ('operation', models.CharField(max_length=64)), - ('variable', models.ForeignKey(related_name='vhistory', to='orm.Variable')), + ('variable', models.ForeignKey(related_name='vhistory', to='orm.Variable', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='project', name='release', - field=models.ForeignKey(to='orm.Release', null=True), + field=models.ForeignKey(to='orm.Release', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='package_dependency', name='target', - field=models.ForeignKey(to='orm.Target', null=True), + field=models.ForeignKey(to='orm.Target', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='package', name='recipe', - field=models.ForeignKey(to='orm.Recipe', null=True), + field=models.ForeignKey(to='orm.Recipe', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='logmessage', name='task', - field=models.ForeignKey(blank=True, to='orm.Task', null=True), + field=models.ForeignKey(blank=True, to='orm.Task', null=True, on_delete=models.CASCADE), ), migrations.AlterUniqueTogether( name='layersource', @@ -411,32 +411,32 @@ class Migration(migrations.Migration): migrations.AddField( model_name='layer_version', name='layer_source', - field=models.ForeignKey(default=None, to='orm.LayerSource', null=True), + field=models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='layer_version', name='project', - field=models.ForeignKey(default=None, to='orm.Project', null=True), + field=models.ForeignKey(default=None, to='orm.Project', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='layer_version', name='up_branch', - field=models.ForeignKey(default=None, to='orm.Branch', null=True), + field=models.ForeignKey(default=None, to='orm.Branch', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='layer', name='layer_source', - field=models.ForeignKey(default=None, to='orm.LayerSource', null=True), + field=models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='build', name='project', - field=models.ForeignKey(to='orm.Project'), + field=models.ForeignKey(to='orm.Project', on_delete=models.CASCADE), ), migrations.AddField( model_name='branch', name='layer_source', - field=models.ForeignKey(default=True, to='orm.LayerSource', null=True), + field=models.ForeignKey(default=True, to='orm.LayerSource', null=True, on_delete=models.CASCADE), ), migrations.CreateModel( name='ImportedLayerSource', diff --git a/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py b/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py index 9cec82e8d4..09c2bffa28 100644 --- a/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py +++ b/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py @@ -14,10 +14,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='CustomImageRecipe', fields=[ - ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe')), + ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe', on_delete=models.CASCADE)), ('last_updated', models.DateTimeField(default=None, null=True)), - ('base_recipe', models.ForeignKey(related_name='based_on_recipe', to='orm.Recipe')), - ('project', models.ForeignKey(to='orm.Project')), + ('base_recipe', models.ForeignKey(related_name='based_on_recipe', to='orm.Recipe', on_delete=models.CASCADE)), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], bases=('orm.recipe',), ), diff --git a/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py b/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py index b027f66137..8cb81d7b5e 100644 --- a/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py +++ b/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='CustomImagePackage', fields=[ - ('package_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Package')), + ('package_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Package', on_delete=models.CASCADE)), ('recipe_appends', models.ManyToManyField(related_name='appends_set', to='orm.CustomImageRecipe')), ('recipe_excludes', models.ManyToManyField(related_name='excludes_set', to='orm.CustomImageRecipe')), ('recipe_includes', models.ManyToManyField(related_name='includes_set', to='orm.CustomImageRecipe')), diff --git a/bitbake/lib/toaster/orm/migrations/0004_provides.py b/bitbake/lib/toaster/orm/migrations/0004_provides.py index dfde2d1361..8449604989 100644 --- a/bitbake/lib/toaster/orm/migrations/0004_provides.py +++ b/bitbake/lib/toaster/orm/migrations/0004_provides.py @@ -16,12 +16,12 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100)), - ('recipe', models.ForeignKey(to='orm.Recipe')), + ('recipe', models.ForeignKey(to='orm.Recipe', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='recipe_dependency', name='via', - field=models.ForeignKey(null=True, default=None, to='orm.Provides'), + field=models.ForeignKey(null=True, default=None, to='orm.Provides', on_delete=models.CASCADE), ), ] diff --git a/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py b/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py index 3367582a81..41a547a60e 100644 --- a/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py +++ b/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py @@ -17,7 +17,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to='orm.Target')), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -26,7 +26,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to='orm.Target')), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.RemoveField( diff --git a/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py b/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py index 75506961a9..3f3a2e1612 100644 --- a/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py +++ b/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): diff --git a/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py b/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py index 0e6bb83311..4b96bf0969 100644 --- a/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py +++ b/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py @@ -46,7 +46,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='layer_version', name='release', - field=models.ForeignKey(to='orm.Release', default=None, null=True), + field=models.ForeignKey(to='orm.Release', default=None, null=True, on_delete=models.CASCADE), ), migrations.RunPython(branch_to_release, reverse_code=migrations.RunPython.noop), diff --git a/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py b/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py index d3c5901275..731c0debd2 100644 --- a/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py +++ b/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py @@ -18,7 +18,7 @@ class Migration(migrations.Migration): ('up_date', models.DateTimeField(default=None, null=True)), ('name', models.CharField(max_length=255)), ('description', models.CharField(max_length=255)), - ('layer_version', models.ForeignKey(to='orm.Layer_Version')), + ('layer_version', models.ForeignKey(to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), ] diff --git a/bitbake/lib/toaster/orm/migrations/0019_django_2_2.py b/bitbake/lib/toaster/orm/migrations/0019_django_2_2.py new file mode 100644 index 0000000000..666aef18be --- /dev/null +++ b/bitbake/lib/toaster/orm/migrations/0019_django_2_2.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.7 on 2019-11-19 03:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('orm', '0018_project_specific'), + ] + + operations = [ + migrations.RemoveField( + model_name='distro', + name='up_id', + ), + migrations.AlterField( + model_name='build', + name='recipes_parsed', + field=models.IntegerField(default=1), + ), + ] diff --git a/bitbake/lib/toaster/orm/migrations/0020_models_bigautofield.py b/bitbake/lib/toaster/orm/migrations/0020_models_bigautofield.py new file mode 100644 index 0000000000..f19b5dddbc --- /dev/null +++ b/bitbake/lib/toaster/orm/migrations/0020_models_bigautofield.py @@ -0,0 +1,173 @@ +# Generated by Django 3.2.12 on 2022-03-06 03:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orm', '0019_django_2_2'), + ] + + operations = [ + migrations.AlterField( + model_name='bitbakeversion', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='build', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='distro', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='helptext', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='layer', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='layer_version', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='layerversiondependency', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='logmessage', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='machine', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='package', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='package_dependency', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='package_file', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='project', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='projectlayer', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='projecttarget', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='projectvariable', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='provides', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='recipe', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='recipe_dependency', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='release', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='releasedefaultlayer', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='target', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='target_file', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='target_image_file', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='target_installed_package', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='targetkernelfile', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='targetsdkfile', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='task', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='task_dependency', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='toastersetting', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='variable', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='variablehistory', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/bitbake/lib/toaster/orm/migrations/0021_eventlogsimports.py b/bitbake/lib/toaster/orm/migrations/0021_eventlogsimports.py new file mode 100644 index 0000000000..328eb5753c --- /dev/null +++ b/bitbake/lib/toaster/orm/migrations/0021_eventlogsimports.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.5 on 2023-11-23 18:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orm', '0020_models_bigautofield'), + ] + + operations = [ + migrations.CreateModel( + name='EventLogsImports', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('imported', models.BooleanField(default=False)), + ('build_id', models.IntegerField(blank=True, null=True)), + ], + ), + ] diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index 7720290214..19c9686206 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py @@ -1,23 +1,10 @@ # -# ex:ts=4:sw=4:sts=4:et -# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -# # BitBake Toaster Implementation # # Copyright (C) 2013 Intel Corporation # -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# SPDX-License-Identifier: GPL-2.0-only # -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import unicode_literals @@ -26,7 +13,7 @@ from django.db.models import F, Q, Sum, Count from django.utils import timezone from django.utils.encoding import force_bytes -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core import validators from django.conf import settings @@ -71,7 +58,6 @@ if 'sqlite' in settings.DATABASES['default']['ENGINE']: return _base_insert(self, *args, **kwargs) QuerySet._insert = _insert - from django.utils import six def _create_object_from_params(self, lookup, params): """ Tries to create an object using passed params. @@ -121,7 +107,7 @@ class ToasterSetting(models.Model): class ProjectManager(models.Manager): - def create_project(self, name, release, existing_project=None): + def create_project(self, name, release, existing_project=None, imported=False): if existing_project and (release is not None): prj = existing_project prj.bitbake_version = release.bitbake_version @@ -148,19 +134,19 @@ class ProjectManager(models.Manager): if release is None: return prj - - for rdl in release.releasedefaultlayer_set.all(): - lv = Layer_Version.objects.filter( - layer__name=rdl.layer_name, - release=release).first() - - if lv: - ProjectLayer.objects.create(project=prj, - layercommit=lv, - optional=False) - else: - logger.warning("Default project layer %s not found" % - rdl.layer_name) + if not imported: + for rdl in release.releasedefaultlayer_set.all(): + lv = Layer_Version.objects.filter( + layer__name=rdl.layer_name, + release=release).first() + + if lv: + ProjectLayer.objects.create(project=prj, + layercommit=lv, + optional=False) + else: + logger.warning("Default project layer %s not found" % + rdl.layer_name) return prj @@ -191,8 +177,8 @@ class Project(models.Model): 'release__branch_name'] name = models.CharField(max_length=100) short_description = models.CharField(max_length=50, blank=True) - bitbake_version = models.ForeignKey('BitbakeVersion', null=True) - release = models.ForeignKey("Release", null=True) + bitbake_version = models.ForeignKey('BitbakeVersion', on_delete=models.CASCADE, null=True) + release = models.ForeignKey("Release", on_delete=models.CASCADE, null=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # This is a horrible hack; since Toaster has no "User" model available when @@ -482,7 +468,7 @@ class Build(models.Model): search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"] - project = models.ForeignKey(Project) # must have a project + project = models.ForeignKey(Project, on_delete=models.CASCADE) # must have a project machine = models.CharField(max_length=100) distro = models.CharField(max_length=100) distro_version = models.CharField(max_length=100) @@ -790,13 +776,13 @@ class Build(models.Model): return "%d %s %s" % (self.id, self.project, ",".join([t.target for t in self.target_set.all()])) class ProjectTarget(models.Model): - project = models.ForeignKey(Project) + project = models.ForeignKey(Project, on_delete=models.CASCADE) target = models.CharField(max_length=100) task = models.CharField(max_length=100, null=True) class Target(models.Model): search_allowed_fields = ['target', 'file_name'] - build = models.ForeignKey(Build) + build = models.ForeignKey(Build, on_delete=models.CASCADE) target = models.CharField(max_length=100) task = models.CharField(max_length=100, null=True) is_image = models.BooleanField(default = False) @@ -957,7 +943,7 @@ class Target(models.Model): # kernel artifacts for a target: bzImage and modules* class TargetKernelFile(models.Model): - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) file_name = models.FilePathField() file_size = models.IntegerField() @@ -967,7 +953,7 @@ class TargetKernelFile(models.Model): # SDK artifacts for a target: sh and manifest files class TargetSDKFile(models.Model): - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) file_name = models.FilePathField() file_size = models.IntegerField() @@ -978,15 +964,15 @@ class TargetSDKFile(models.Model): class Target_Image_File(models.Model): # valid suffixes for image files produced by a build SUFFIXES = { - 'btrfs', 'cpio', 'cpio.gz', 'cpio.lz4', 'cpio.lzma', 'cpio.xz', - 'cramfs', 'elf', 'ext2', 'ext2.bz2', 'ext2.gz', 'ext2.lzma', 'ext4', - 'ext4.gz', 'ext3', 'ext3.gz', 'hdddirect', 'hddimg', 'iso', 'jffs2', - 'jffs2.sum', 'multiubi', 'qcow2', 'squashfs', 'squashfs-lzo', + 'btrfs', 'container', 'cpio', 'cpio.gz', 'cpio.lz4', 'cpio.lzma', + 'cpio.xz', 'cramfs', 'ext2', 'ext2.bz2', 'ext2.gz', 'ext2.lzma', + 'ext3', 'ext3.gz', 'ext4', 'ext4.gz', 'f2fs', 'hddimg', 'iso', 'jffs2', + 'jffs2.sum', 'multiubi', 'squashfs', 'squashfs-lz4', 'squashfs-lzo', 'squashfs-xz', 'tar', 'tar.bz2', 'tar.gz', 'tar.lz4', 'tar.xz', 'ubi', - 'ubifs', 'vdi', 'vmdk', 'wic', 'wic.bmap', 'wic.bz2', 'wic.gz', 'wic.lzma' + 'ubifs', 'wic', 'wic.bz2', 'wic.gz', 'wic.lzma' } - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) file_name = models.FilePathField(max_length=254) file_size = models.IntegerField() @@ -1020,15 +1006,15 @@ class Target_File(models.Model): ( ITYPE_BLOCK ,'block'), ) - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) path = models.FilePathField() size = models.IntegerField() inodetype = models.IntegerField(choices = ITYPES) permission = models.CharField(max_length=16) owner = models.CharField(max_length=128) group = models.CharField(max_length=128) - directory = models.ForeignKey('Target_File', related_name="directory_set", null=True) - sym_target = models.ForeignKey('Target_File', related_name="symlink_set", null=True) + directory = models.ForeignKey('Target_File', on_delete=models.CASCADE, related_name="directory_set", null=True) + sym_target = models.ForeignKey('Target_File', on_delete=models.CASCADE, related_name="symlink_set", null=True) class Task(models.Model): @@ -1115,13 +1101,13 @@ class Task(models.Model): def get_description(self): return self._helptext - build = models.ForeignKey(Build, related_name='task_build') + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='task_build') order = models.IntegerField(null=True) task_executed = models.BooleanField(default=False) # True means Executed, False means Not/Executed outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA) sstate_checksum = models.CharField(max_length=100, blank=True) path_to_sstate_obj = models.FilePathField(max_length=500, blank=True) - recipe = models.ForeignKey('Recipe', related_name='tasks') + recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE, related_name='tasks') task_name = models.CharField(max_length=100) source_url = models.FilePathField(max_length=255, blank=True) work_directory = models.FilePathField(max_length=255, blank=True) @@ -1160,13 +1146,13 @@ class Task(models.Model): class Task_Dependency(models.Model): - task = models.ForeignKey(Task, related_name='task_dependencies_task') - depends_on = models.ForeignKey(Task, related_name='task_dependencies_depends') + task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='task_dependencies_task') + depends_on = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='task_dependencies_depends') class Package(models.Model): search_allowed_fields = ['name', 'version', 'revision', 'recipe__name', 'recipe__version', 'recipe__license', 'recipe__layer_version__layer__name', 'recipe__layer_version__branch', 'recipe__layer_version__commit', 'recipe__layer_version__local_path', 'installed_name'] - build = models.ForeignKey('Build', null=True) - recipe = models.ForeignKey('Recipe', null=True) + build = models.ForeignKey('Build', on_delete=models.CASCADE, null=True) + recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE, null=True) name = models.CharField(max_length=100) installed_name = models.CharField(max_length=100, default='') version = models.CharField(max_length=100, blank=True) @@ -1302,19 +1288,19 @@ class Package_Dependency(models.Model): TYPE_RCONFLICTS : ("conflicts", "%s conflicts with %s, which will not be installed if this package is not first removed"), } - package = models.ForeignKey(Package, related_name='package_dependencies_source') - depends_on = models.ForeignKey(Package, related_name='package_dependencies_target') # soft dependency + package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package_dependencies_source') + depends_on = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package_dependencies_target') # soft dependency dep_type = models.IntegerField(choices=DEPENDS_TYPE) - target = models.ForeignKey(Target, null=True) + target = models.ForeignKey(Target, on_delete=models.CASCADE, null=True) objects = Package_DependencyManager() class Target_Installed_Package(models.Model): - target = models.ForeignKey(Target) - package = models.ForeignKey(Package, related_name='buildtargetlist_package') + target = models.ForeignKey(Target, on_delete=models.CASCADE) + package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='buildtargetlist_package') class Package_File(models.Model): - package = models.ForeignKey(Package, related_name='buildfilelist_package') + package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='buildfilelist_package') path = models.FilePathField(max_length=255, blank=True) size = models.IntegerField() @@ -1331,7 +1317,7 @@ class Recipe(models.Model): name = models.CharField(max_length=100, blank=True) version = models.CharField(max_length=100, blank=True) - layer_version = models.ForeignKey('Layer_Version', + layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE, related_name='recipe_layer_version') summary = models.TextField(blank=True) description = models.TextField(blank=True) @@ -1369,7 +1355,7 @@ class Recipe_DependencyManager(models.Manager): class Provides(models.Model): name = models.CharField(max_length=100) - recipe = models.ForeignKey(Recipe) + recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE) class Recipe_Dependency(models.Model): TYPE_DEPENDS = 0 @@ -1379,9 +1365,9 @@ class Recipe_Dependency(models.Model): (TYPE_DEPENDS, "depends"), (TYPE_RDEPENDS, "rdepends"), ) - recipe = models.ForeignKey(Recipe, related_name='r_dependencies_recipe') - depends_on = models.ForeignKey(Recipe, related_name='r_dependencies_depends') - via = models.ForeignKey(Provides, null=True, default=None) + recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='r_dependencies_recipe') + depends_on = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='r_dependencies_depends') + via = models.ForeignKey(Provides, on_delete=models.CASCADE, null=True, default=None) dep_type = models.IntegerField(choices=DEPENDS_TYPE) objects = Recipe_DependencyManager() @@ -1390,7 +1376,7 @@ class Machine(models.Model): search_allowed_fields = ["name", "description", "layer_version__layer__name"] up_date = models.DateTimeField(null = True, default = None) - layer_version = models.ForeignKey('Layer_Version') + layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE) name = models.CharField(max_length=255) description = models.CharField(max_length=255) @@ -1403,9 +1389,6 @@ class Machine(models.Model): return "Machine " + self.name + "(" + self.description + ")" - - - class BitbakeVersion(models.Model): name = models.CharField(max_length=32, unique = True) @@ -1421,7 +1404,7 @@ class Release(models.Model): """ A release is a project template, used to pre-populate Project settings with a configuration set """ name = models.CharField(max_length=32, unique = True) description = models.CharField(max_length=255) - bitbake_version = models.ForeignKey(BitbakeVersion) + bitbake_version = models.ForeignKey(BitbakeVersion, on_delete=models.CASCADE) branch_name = models.CharField(max_length=50, default = "") helptext = models.TextField(null=True) @@ -1432,7 +1415,7 @@ class Release(models.Model): return self.name class ReleaseDefaultLayer(models.Model): - release = models.ForeignKey(Release) + release = models.ForeignKey(Release, on_delete=models.CASCADE) layer_name = models.CharField(max_length=100, default="") @@ -1487,10 +1470,10 @@ class Layer_Version(models.Model): "layer__description", "layer__vcs_url", "dirpath", "release__name", "commit", "branch"] - build = models.ForeignKey(Build, related_name='layer_version_build', + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='layer_version_build', default=None, null=True) - layer = models.ForeignKey(Layer, related_name='layer_version_layer') + layer = models.ForeignKey(Layer, on_delete=models.CASCADE, related_name='layer_version_layer') layer_source = models.IntegerField(choices=LayerSource.SOURCE_TYPE, default=0) @@ -1498,7 +1481,7 @@ class Layer_Version(models.Model): up_date = models.DateTimeField(null=True, default=timezone.now) # To which metadata release does this layer version belong to - release = models.ForeignKey(Release, null=True, default=None) + release = models.ForeignKey(Release, on_delete=models.CASCADE, null=True, default=None) branch = models.CharField(max_length=80) commit = models.CharField(max_length=100) @@ -1512,7 +1495,7 @@ class Layer_Version(models.Model): local_path = models.FilePathField(max_length=1024, default="/") # Set if this layer is restricted to a particular project - project = models.ForeignKey('Project', null=True, default=None) + project = models.ForeignKey('Project', on_delete=models.CASCADE, null=True, default=None) # code lifted, with adaptations, from the layerindex-web application # https://git.yoctoproject.org/cgit/cgit.cgi/layerindex-web/ @@ -1621,14 +1604,14 @@ class Layer_Version(models.Model): class LayerVersionDependency(models.Model): - layer_version = models.ForeignKey(Layer_Version, + layer_version = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, related_name="dependencies") - depends_on = models.ForeignKey(Layer_Version, + depends_on = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, related_name="dependees") class ProjectLayer(models.Model): - project = models.ForeignKey(Project) - layercommit = models.ForeignKey(Layer_Version, null=True) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + layercommit = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, null=True) optional = models.BooleanField(default = True) def __unicode__(self): @@ -1643,8 +1626,8 @@ class CustomImageRecipe(Recipe): LAYER_NAME = "toaster-custom-images" search_allowed_fields = ['name'] - base_recipe = models.ForeignKey(Recipe, related_name='based_on_recipe') - project = models.ForeignKey(Project) + base_recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='based_on_recipe') + project = models.ForeignKey(Project, on_delete=models.CASCADE) last_updated = models.DateTimeField(null=True, default=None) def get_last_successful_built_target(self): @@ -1660,14 +1643,14 @@ class CustomImageRecipe(Recipe): """ # Check if we're aldready up-to-date or not target = self.get_last_successful_built_target() - if target == None: + if target is None: # So we've never actually built this Custom recipe but what about # the recipe it's based on? target = \ Target.objects.filter(Q(build__outcome=Build.SUCCEEDED) & Q(build__project=self.project) & Q(target=self.base_recipe.name)).last() - if target == None: + if target is None: return if target.build.completed_on == self.last_updated: @@ -1730,9 +1713,9 @@ class CustomImageRecipe(Recipe): def generate_recipe_file_contents(self): """Generate the contents for the recipe file.""" - # If we have no excluded packages we only need to _append + # If we have no excluded packages we only need to :append if self.excludes_set.count() == 0: - packages_conf = "IMAGE_INSTALL_append = \" " + packages_conf = "IMAGE_INSTALL:append = \" " for pkg in self.appends_set.all(): packages_conf += pkg.name+' ' @@ -1747,7 +1730,7 @@ class CustomImageRecipe(Recipe): packages_conf += "\"" base_recipe_path = self.get_base_recipe_file() - if base_recipe_path: + if base_recipe_path and os.path.isfile(base_recipe_path): base_recipe = open(base_recipe_path, 'r').read() else: # Pass back None to trigger error message to user @@ -1797,14 +1780,14 @@ class CustomImageRecipe(Recipe): return recipe_contents class ProjectVariable(models.Model): - project = models.ForeignKey(Project) + project = models.ForeignKey(Project, on_delete=models.CASCADE) name = models.CharField(max_length=100) value = models.TextField(blank = True) class Variable(models.Model): search_allowed_fields = ['variable_name', 'variable_value', 'vhistory__file_name', "description"] - build = models.ForeignKey(Build, related_name='variable_build') + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='variable_build') variable_name = models.CharField(max_length=100) variable_value = models.TextField(blank=True) changed = models.BooleanField(default=False) @@ -1812,7 +1795,7 @@ class Variable(models.Model): description = models.TextField(blank=True) class VariableHistory(models.Model): - variable = models.ForeignKey(Variable, related_name='vhistory') + variable = models.ForeignKey(Variable, on_delete=models.CASCADE, related_name='vhistory') value = models.TextField(blank=True) file_name = models.FilePathField(max_length=255) line_number = models.IntegerField(null=True) @@ -1822,7 +1805,7 @@ class HelpText(models.Model): VARIABLE = 0 HELPTEXT_AREA = ((VARIABLE, 'variable'), ) - build = models.ForeignKey(Build, related_name='helptext_build') + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='helptext_build') area = models.IntegerField(choices=HELPTEXT_AREA) key = models.CharField(max_length=100) text = models.TextField() @@ -1842,8 +1825,8 @@ class LogMessage(models.Model): (EXCEPTION, "toaster exception") ) - build = models.ForeignKey(Build) - task = models.ForeignKey(Task, blank = True, null=True) + build = models.ForeignKey(Build, on_delete=models.CASCADE) + task = models.ForeignKey(Task, on_delete=models.CASCADE, blank = True, null=True) level = models.IntegerField(choices=LOG_LEVEL, default=INFO) message = models.TextField(blank=True, null=True) pathname = models.FilePathField(max_length=255, blank=True) @@ -1867,12 +1850,14 @@ def signal_runbuilds(): os.kill(int(pidf.read()), SIGUSR1) except FileNotFoundError: logger.info("Stopping existing runbuilds: no current process found") + except ProcessLookupError: + logger.warning("Stopping existing runbuilds: process lookup not found") class Distro(models.Model): search_allowed_fields = ["name", "description", "layer_version__layer__name"] up_date = models.DateTimeField(null = True, default = None) - layer_version = models.ForeignKey('Layer_Version') + layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE) name = models.CharField(max_length=255) description = models.CharField(max_length=255) @@ -1883,6 +1868,15 @@ class Distro(models.Model): def __unicode__(self): return "Distro " + self.name + "(" + self.description + ")" +class EventLogsImports(models.Model): + name = models.CharField(max_length=255) + imported = models.BooleanField(default=False) + build_id = models.IntegerField(blank=True, null=True) + + def __str__(self): + return self.name + + django.db.models.signals.post_save.connect(invalidate_cache) django.db.models.signals.post_delete.connect(invalidate_cache) django.db.models.signals.m2m_changed.connect(invalidate_cache) |