[Toaster] [PATCH 1/5] toaster: Remove DATABASE_URL being passed around as an environment var

Smith, Elliot elliot.smith at intel.com
Tue Apr 26 10:10:08 PDT 2016


On 25 April 2016 at 19:04, Michael Wood <michael.g.wood at intel.com> wrote:

> We don't need to pass the DATABASE_URL around and read it back if we
> setup the django framework in the correct way.
> We make the default sqlite database path a full path so that the
> database isn't being assumed to be in CWD.
>

I think there's a problem here, as I get multiple errors when I try to run
a build via the Toaster UI (see attached file).

The build does appear to complete correctly (bitbake reports that the tasks
have run); but Toaster never notices this, presumably because of the
errors, and the build "hangs" in the UI.

I think the problem is that the database isn't being located correctly by
toasterui, which makes it appear as though *all* of the database tables are
missing. Note that the migrations have run and I have the toaster.sqlite
file in my build/ directory as expected, complete with all its tables. I
have replicated this with a completely clean shell and new database.

Elliot


>
> Also add some more useful comments on the database settings.
>
> This is preparation work to migrate the build tests and be able to
> trigger builds on differently configured databases.
>
> Signed-off-by: Michael Wood <michael.g.wood at intel.com>
> ---
>  bitbake/bin/toaster                                |  2 -
>  bitbake/lib/bb/ui/buildinfohelper.py               | 20 +++----
>  .../toastermain/management/commands/get-dburl.py   |  9 ---
>  bitbake/lib/toaster/toastermain/settings.py        | 64
> +++-------------------
>  4 files changed, 17 insertions(+), 78 deletions(-)
>  delete mode 100644
> bitbake/lib/toaster/toastermain/management/commands/get-dburl.py
>
> diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster
> index 987d53c1..91716e6 100755
> --- a/bitbake/bin/toaster
> +++ b/bitbake/bin/toaster
> @@ -100,7 +100,6 @@ stop_system()
>      fi
>      webserverKillAll
>      # unset exported variables
> -    unset DATABASE_URL
>      unset TOASTER_CONF
>      unset TOASTER_DIR
>      unset BITBAKE_UI
> @@ -278,7 +277,6 @@ case $CMD in
>              return 4
>          fi
>          export BITBAKE_UI='toasterui'
> -        export DATABASE_URL=`$MANAGE get-dburl`
>          $MANAGE runbuilds & echo $! >${BUILDDIR}/.runbuilds.pid
>          # set fail safe stop system on terminal exit
>          trap stop_system SIGHUP
> diff --git a/bitbake/lib/bb/ui/buildinfohelper.py
> b/bitbake/lib/bb/ui/buildinfohelper.py
> index 9397905..b07dc81 100644
> --- a/bitbake/lib/bb/ui/buildinfohelper.py
> +++ b/bitbake/lib/bb/ui/buildinfohelper.py
> @@ -21,19 +21,19 @@ import bb
>  import re
>  import os
>
> -os.environ["DJANGO_SETTINGS_MODULE"] = "toaster.toastermain.settings"
> -
> -
>  import django
>  from django.utils import timezone
>
> +import toaster
> +# Add toaster module to the search path to help django.setup() find the
> right
> +# modules
> +sys.path.insert(0, os.path.dirname(toaster.__file__))
>
> -def _configure_toaster():
> -    """ Add toaster to sys path for importing modules
> -    """
> -
> sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
> 'toaster'))
> -_configure_toaster()
> -
> +#Set the DJANGO_SETTINGS_MODULE if it's not already set
> +os.environ["DJANGO_SETTINGS_MODULE"] =\
> +    os.environ.get("DJANGO_SETTINGS_MODULE",
> +                   "toaster.toastermain.settings")
> +# Setup django framework (needs to be done before importing modules)
>  django.setup()
>
>  from orm.models import Build, Task, Recipe, Layer_Version, Layer, Target,
> LogMessage, HelpText
> @@ -54,11 +54,11 @@ from datetime import datetime, timedelta
>
>  from django.db import transaction, connection
>
> +
>  # pylint: disable=invalid-name
>  # the logger name is standard throughout BitBake
>  logger = logging.getLogger("ToasterLogger")
>
> -
>  class NotExisting(Exception):
>      pass
>
> diff --git
> a/bitbake/lib/toaster/toastermain/management/commands/get-dburl.py
> b/bitbake/lib/toaster/toastermain/management/commands/get-dburl.py
> deleted file mode 100644
> index 22b3eb7..0000000
> --- a/bitbake/lib/toaster/toastermain/management/commands/get-dburl.py
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -from toastermain.settings import getDATABASE_URL
> -from django.core.management.base import NoArgsCommand
> -
> -class Command(NoArgsCommand):
> -    args    = ""
> -    help    = "get database url"
> -
> -    def handle_noargs(self,**options):
> -        print getDATABASE_URL()
> diff --git a/bitbake/lib/toaster/toastermain/settings.py
> b/bitbake/lib/toaster/toastermain/settings.py
> index 74ab604..063460b 100644
> --- a/bitbake/lib/toaster/toastermain/settings.py
> +++ b/bitbake/lib/toaster/toastermain/settings.py
> @@ -21,7 +21,7 @@
>
>  # Django settings for Toaster project.
>
> -import os, re
> +import os
>
>  DEBUG = True
>  TEMPLATE_DEBUG = DEBUG
> @@ -40,12 +40,14 @@ MANAGERS = ADMINS
>
>  DATABASES = {
>      'default': {
> -        'ENGINE': 'django.db.backends.sqlite3', # Add
> 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
> -        'NAME': 'toaster.sqlite',                      # Or path to
> database file if using sqlite3.
> +        # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
> +        'ENGINE': 'django.db.backends.sqlite3',
> +        # DB name or full path to database file if using sqlite3.
> +        'NAME': 'toaster.sqlite',
>          'USER': '',
>          'PASSWORD': '',
> -        'HOST': '127.0.0.1',                      # Empty for localhost
> through domain sockets or '127.0.0.1' for localhost through TCP.
> -        'PORT': '3306',                      # Set to empty string for
> default.
> +        #'HOST': '127.0.0.1', # e.g. mysql server
> +        #'PORT': '3306', # e.g. mysql port
>      }
>  }
>
> @@ -55,58 +57,6 @@ DATABASES = {
>  if 'sqlite' in DATABASES['default']['ENGINE']:
>      DATABASES['default']['OPTIONS'] = { 'timeout': 20 }
>
> -# Reinterpret database settings if we have DATABASE_URL environment
> variable defined
> -
> -if 'DATABASE_URL' in os.environ:
> -    dburl = os.environ['DATABASE_URL']
> -
> -    if dburl.startswith('sqlite3://'):
> -        result = re.match('sqlite3://(.*)', dburl)
> -        if result is None:
> -            raise Exception("ERROR: Could not read sqlite database url:
> %s" % dburl)
> -        DATABASES['default'] = {
> -            'ENGINE': 'django.db.backends.sqlite3',
> -            'NAME': result.group(1),
> -            'USER': '',
> -            'PASSWORD': '',
> -            'HOST': '',
> -            'PORT': '',
> -        }
> -    elif dburl.startswith('mysql://'):
> -        # URL must be in this form: mysql://user:pass@host:port/name
> -        result =
> re.match(r"mysql://([^:]*):([^@]*)@([^:]*):(\d*)/([^/]*)", dburl)
> -        if result is None:
> -            raise Exception("ERROR: Could not read mysql database url:
> %s" % dburl)
> -        DATABASES['default'] = {
> -            'ENGINE': 'django.db.backends.mysql',
> -            'NAME': result.group(5),
> -            'USER': result.group(1),
> -            'PASSWORD': result.group(2),
> -            'HOST': result.group(3),
> -            'PORT': result.group(4),
> -        }
> -    else:
> -        raise Exception("FIXME: Please implement missing database url
> schema for url: %s" % dburl)
> -
> -
> -# Allows current database settings to be exported as a DATABASE_URL
> environment variable value
> -
> -def getDATABASE_URL():
> -    d = DATABASES['default']
> -    if d['ENGINE'] == 'django.db.backends.sqlite3':
> -        if d['NAME'] == ':memory:':
> -            return 'sqlite3://:memory:'
> -        elif d['NAME'].startswith("/"):
> -            return 'sqlite3://' + d['NAME']
> -        return "sqlite3://" + os.path.join(os.getcwd(), d['NAME'])
> -
> -    elif d['ENGINE'] == 'django.db.backends.mysql':
> -        return "mysql://" + d['USER'] + ":" + d['PASSWORD'] + "@" +
> d['HOST'] + ":" + d['PORT'] + "/" + d['NAME']
> -
> -    raise Exception("FIXME: Please implement missing database url schema
> for engine: %s" % d['ENGINE'])
> -
> -
> -
>  # Hosts/domain names that are valid for this site; required if DEBUG is
> False
>  # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
>  ALLOWED_HOSTS = []
> --
> 2.7.4
>
> --
> _______________________________________________
> toaster mailing list
> toaster at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/toaster
>



-- 
Elliot Smith
Software Engineer
Intel Open Source Technology Centre
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/toaster/attachments/20160426/0dc85f64/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: toaster_ui.log
Type: text/x-log
Size: 135264 bytes
Desc: not available
URL: <http://lists.yoctoproject.org/pipermail/toaster/attachments/20160426/0dc85f64/attachment-0001.bin>


More information about the toaster mailing list