aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/init
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin/init')
-rw-r--r--mediagoblin/init/__init__.py29
-rw-r--r--mediagoblin/init/celery/__init__.py23
-rw-r--r--mediagoblin/init/config.py47
3 files changed, 72 insertions, 27 deletions
diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py
index e0711416..05a26792 100644
--- a/mediagoblin/init/__init__.py
+++ b/mediagoblin/init/__init__.py
@@ -28,6 +28,8 @@ from mediagoblin.tools.pluginapi import hook_runall
from mediagoblin.tools.workbench import WorkbenchManager
from mediagoblin.storage import storage_system_from_config
+from mediagoblin.tools.transition import DISABLE_GLOBALS
+
class Error(Exception):
pass
@@ -58,18 +60,26 @@ def setup_global_and_app_config(config_path):
return global_config, app_config
-def setup_database(run_migrations=False):
- app_config = mg_globals.app_config
- global_config = mg_globals.global_config
+def setup_database(app):
+ app_config = app.app_config
+ global_config = app.global_config
+ run_migrations = app_config['run_migrations']
# Load all models for media types (plugins, ...)
load_models(app_config)
# Set up the database
- db = setup_connection_and_db_from_config(app_config, run_migrations)
+ db = setup_connection_and_db_from_config(
+ app_config, run_migrations, app=app)
+ # run_migrations is used for tests
if run_migrations:
- #Run the migrations to initialize/update the database.
- from mediagoblin.gmg_commands.dbupdate import run_all_migrations
- run_all_migrations(db, app_config, global_config)
+ # Run the migrations to initialize/update the database.
+ # We only run the alembic migrations in the case of unit
+ # tests, in which case we don't need to run the legacy
+ # migrations.
+ from mediagoblin.gmg_commands.dbupdate import (
+ run_alembic_migrations, run_foundations)
+ run_alembic_migrations(db, app_config, global_config)
+ run_foundations(db, global_config)
else:
check_db_migrations_current(db)
@@ -154,4 +164,7 @@ def setup_workbench():
workbench_manager = WorkbenchManager(app_config['workbench_path'])
- setup_globals(workbench_manager=workbench_manager)
+ if not DISABLE_GLOBALS:
+ setup_globals(workbench_manager=workbench_manager)
+
+ return workbench_manager
diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py
index 57242bf6..780e0055 100644
--- a/mediagoblin/init/celery/__init__.py
+++ b/mediagoblin/init/celery/__init__.py
@@ -16,8 +16,11 @@
import os
import sys
+import datetime
import logging
+import six
+
from celery import Celery
from mediagoblin.tools.pluginapi import hook_runall
@@ -27,7 +30,9 @@ _log = logging.getLogger(__name__)
MANDATORY_CELERY_IMPORTS = [
'mediagoblin.processing.task',
- 'mediagoblin.notifications.task']
+ 'mediagoblin.notifications.task',
+ 'mediagoblin.submit.task',
+]
DEFAULT_SETTINGS_MODULE = 'mediagoblin.init.celery.dummy_settings_module'
@@ -45,7 +50,7 @@ def get_celery_settings_dict(app_config, global_config,
celery_settings = {}
# Add all celery settings from config
- for key, value in celery_conf.iteritems():
+ for key, value in six.iteritems(celery_conf):
celery_settings[key] = value
# TODO: use default result stuff here if it exists
@@ -58,6 +63,18 @@ def get_celery_settings_dict(app_config, global_config,
celery_settings['CELERY_ALWAYS_EAGER'] = True
celery_settings['CELERY_EAGER_PROPAGATES_EXCEPTIONS'] = True
+ # Garbage collection periodic task
+ frequency = app_config.get('garbage_collection', 60)
+ if frequency:
+ frequency = int(frequency)
+ celery_settings['CELERYBEAT_SCHEDULE'] = {
+ 'garbage-collection': {
+ 'task': 'mediagoblin.submit.task.collect_garbage',
+ 'schedule': datetime.timedelta(minutes=frequency),
+ }
+ }
+ celery_settings['BROKER_HEARTBEAT'] = 1
+
return celery_settings
@@ -98,7 +115,7 @@ def setup_celery_from_config(app_config, global_config,
__import__(settings_module)
this_module = sys.modules[settings_module]
- for key, value in celery_settings.iteritems():
+ for key, value in six.iteritems(celery_settings):
setattr(this_module, key, value)
if set_environ:
diff --git a/mediagoblin/init/config.py b/mediagoblin/init/config.py
index 11a91cff..a9189e8d 100644
--- a/mediagoblin/init/config.py
+++ b/mediagoblin/init/config.py
@@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import copy
import logging
import os
import pkg_resources
@@ -29,16 +30,21 @@ CONFIG_SPEC_PATH = pkg_resources.resource_filename(
'mediagoblin', 'config_spec.ini')
-def _setup_defaults(config, config_path):
+def _setup_defaults(config, config_path, extra_defaults=None):
"""
Setup DEFAULTS in a config object from an (absolute) config_path.
"""
+ extra_defaults = extra_defaults or {}
+
config.setdefault('DEFAULT', {})
config['DEFAULT']['here'] = os.path.dirname(config_path)
config['DEFAULT']['__file__'] = config_path
+ for key, value in extra_defaults.items():
+ config['DEFAULT'].setdefault(key, value)
+
-def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
+def read_mediagoblin_config(config_path, config_spec_path=CONFIG_SPEC_PATH):
"""
Read a config object from config_path.
@@ -54,7 +60,7 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
Args:
- config_path: path to the config file
- - config_spec: config file that provides defaults and value types
+ - config_spec_path: config file that provides defaults and value types
for validation / conversion. Defaults to mediagoblin/config_spec.ini
Returns:
@@ -68,7 +74,20 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
# we can add their plugin specs to the general config_spec.
config = ConfigObj(
config_path,
- interpolation='ConfigParser')
+ interpolation="ConfigParser")
+
+ # temporary bootstrap, just setup here and __file__... we'll do this again
+ _setup_defaults(config, config_path)
+
+ # Now load the main config spec
+ config_spec = ConfigObj(
+ config_spec_path,
+ encoding="UTF8", list_values=False, _inspec=True)
+
+ # Set up extra defaults that will be pushed into the rest of the
+ # configs. This is a combined extrapolation of defaults based on
+ mainconfig_defaults = copy.copy(config_spec.get("DEFAULT", {}))
+ mainconfig_defaults.update(config["DEFAULT"])
plugins = config.get("plugins", {}).keys()
plugin_configs = {}
@@ -79,11 +98,12 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
plugin, "config_spec.ini")
if not os.path.exists(plugin_config_spec_path):
continue
-
+
plugin_config_spec = ConfigObj(
plugin_config_spec_path,
- encoding='UTF8', list_values=False, _inspec=True)
- _setup_defaults(plugin_config_spec, config_path)
+ encoding="UTF8", list_values=False, _inspec=True)
+ _setup_defaults(
+ plugin_config_spec, config_path, mainconfig_defaults)
if not "plugin_spec" in plugin_config_spec:
continue
@@ -94,23 +114,18 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
_log.warning(
"When setting up config section, could not import '%s'" %
plugin)
-
- # Now load the main config spec
- config_spec = ConfigObj(
- config_spec,
- encoding='UTF8', list_values=False, _inspec=True)
# append the plugin specific sections of the config spec
- config_spec['plugins'] = plugin_configs
+ config_spec["plugins"] = plugin_configs
- _setup_defaults(config_spec, config_path)
+ _setup_defaults(config_spec, config_path, mainconfig_defaults)
config = ConfigObj(
config_path,
configspec=config_spec,
- interpolation='ConfigParser')
+ interpolation="ConfigParser")
- _setup_defaults(config, config_path)
+ _setup_defaults(config, config_path, mainconfig_defaults)
# For now the validator just works with the default functions,
# but in the future if we want to add additional validation/configuration