Skip to content
This repository has been archived by the owner on Sep 5, 2019. It is now read-only.

Commit

Permalink
Adds the ability to run operations/session changes with a dry-run option
Browse files Browse the repository at this point in the history
  • Loading branch information
Denis Krienbühl committed Jun 26, 2015
1 parent 082fb3a commit 8884123
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 8 deletions.
12 changes: 8 additions & 4 deletions onegov/core/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,16 @@ def cli(ctx, config, namespace):


@cli.command()
@click.option('--dry-run', default=False, is_flag=True,
help="Do not write any changes into the database.")
@click.pass_context
def upgrade(ctx):
def upgrade(ctx, dry_run):
""" Upgrades all application instances of the given namespace(s). """

ctx = ctx.obj

update_path = '/' + uuid4().hex
upgrade_runner = UpgradeRunner(get_tasks())
upgrade_runner = UpgradeRunner(get_tasks(), commit=not dry_run)

for appcfg in ctx['config'].applications:

Expand All @@ -59,7 +61,8 @@ def get_upgrade_runner():

@UpdateApplication.view(model=UpgradeRunner)
def run_upgrade(self, request):
print("Running upgrade for {}".format(request.app.application_id))
title = "Running upgrade for {}".format(request.app.application_id)
print(click.style(title, underline=True))
self.run_upgrade(request)

config.commit()
Expand All @@ -74,7 +77,8 @@ def run_upgrade(self, request):
{
'path': appcfg.path,
'application': UpdateApplication,
'namespace': appcfg.namespace
'namespace': appcfg.namespace,
'configuration': appcfg.configuration
}
]
}), configure_morepath=False)
Expand Down
50 changes: 46 additions & 4 deletions onegov/core/upgrade.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
# -*- coding: utf-8 -*-

import click
import importlib
import networkx as nx
import pkg_resources
import transaction

from alembic.migration import MigrationContext
from alembic.operations import Operations
from onegov.core.utils import Bunch
from inspect import getmembers, isfunction, ismethod


Expand Down Expand Up @@ -32,8 +39,8 @@ def get_upgrade_modules():
for distribution, entry_map in get_distributions_with_entry_map('onegov'):
if 'upgrade' in entry_map:
yield (
distribution.name,
importlib.import_module(entry_map['upgrade'])
distribution.project_name,
importlib.import_module(entry_map['upgrade'].module_name)
)


Expand Down Expand Up @@ -161,9 +168,44 @@ def get_tasks(upgrade_modules=None):
class UpgradeRunner(object):
""" Runs all tasks of a :class:`UpgradeTasksRegistry`. """

def __init__(self, tasks):
def __init__(self, tasks, commit=True):
self.tasks = tasks
self.commit = commit

def run_upgrade(self, request):

for task_id, task in self.tasks:
task(request)

session = request.app.session()
connection = session.bind.connect()

context = Bunch(
request=request,
app=request.app,
session=session,
operations=Operations(MigrationContext.configure(connection))
)

operations_transaction = connection.begin()
session_savepoint = transaction.savepoint()

try:
task(context)
session.flush()

print(click.style('✓', fg='green'), task.task_name)

except:
operations_transaction.rollback()
session_savepoint.rollback()

print(click.style('✗', fg='red'), task.task_name)

raise
else:
if self.commit:
operations_transaction.commit()
transaction.commit()
else:
operations_transaction.rollback()
transaction.abort()
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
version = '0.3.9'

dependencies = {
'alembic',
'bleach',
'cached_property',
'chameleon',
Expand Down

0 comments on commit 8884123

Please sign in to comment.