diff --git a/awx/main/apps.py b/awx/main/apps.py index b45b3c20f2..3f7704f2e6 100644 --- a/awx/main/apps.py +++ b/awx/main/apps.py @@ -1,8 +1,17 @@ from django.apps import AppConfig +from django.db.models.signals import pre_migrate from django.utils.translation import ugettext_lazy as _ +def raise_migration_flag(**kwargs): + from awx.main.tasks import set_migration_flag + set_migration_flag.delay() + + class MainConfig(AppConfig): name = 'awx.main' verbose_name = _('Main') + + def ready(self): + pre_migrate.connect(raise_migration_flag, sender=self) diff --git a/awx/main/middleware.py b/awx/main/middleware.py index b1a03c9a38..3f9c7de56d 100644 --- a/awx/main/middleware.py +++ b/awx/main/middleware.py @@ -18,6 +18,7 @@ from django.db import IntegrityError, connection from django.utils.functional import curry from django.shortcuts import get_object_or_404, redirect from django.apps import apps +from django.core.cache import cache from django.utils.deprecation import MiddlewareMixin from django.utils.translation import ugettext_lazy as _ from django.urls import reverse, resolve @@ -213,8 +214,11 @@ class URLModificationMiddleware(MiddlewareMixin): class MigrationRanCheckMiddleware(MiddlewareMixin): def process_request(self, request): - executor = MigrationExecutor(connection) - plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) - if bool(plan) and \ - getattr(resolve(request.path), 'url_name', '') != 'migrations_notran': - return redirect(reverse("ui:migrations_notran")) + if cache.get('migration_in_progress', False): + executor = MigrationExecutor(connection) + plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) + if not bool(plan): + logger.info('Detected that migration finished, migration page taken down.') + cache.delete('migration_in_progress') + elif getattr(resolve(request.path), 'url_name', '') != 'migrations_notran': + return redirect(reverse("ui:migrations_notran")) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 9b263f550d..7fabe6308d 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -263,6 +263,12 @@ def apply_cluster_membership_policies(): logger.debug('Cluster policy computation finished in {} seconds'.format(time.time() - started_compute)) +@task(queue='tower_broadcast_all', exchange_type='fanout') +def set_migration_flag(): + logger.debug('Received migration-in-progress signal, will serve redirect.') + cache.set('migration_in_progress', True) + + @task(queue='tower_broadcast_all', exchange_type='fanout') def handle_setting_changes(setting_keys): orig_len = len(setting_keys)