diff --git a/awx/main/middleware.py b/awx/main/middleware.py index 3f9c7de56d..147baf3ef8 100644 --- a/awx/main/middleware.py +++ b/awx/main/middleware.py @@ -13,18 +13,17 @@ import urllib.parse from django.conf import settings from django.contrib.auth.models import User from django.db.models.signals import post_save -from django.db.migrations.executor import MigrationExecutor -from django.db import IntegrityError, connection +from django.db import IntegrityError 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 from awx.main.models import ActivityStream from awx.main.utils.named_url_graph import generate_graph, GraphNode +from awx.main.utils.db import migration_in_progress_check_or_relase from awx.conf import fields, register @@ -214,11 +213,7 @@ class URLModificationMiddleware(MiddlewareMixin): class MigrationRanCheckMiddleware(MiddlewareMixin): def process_request(self, request): - 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")) + if migration_in_progress_check_or_relase(): + if getattr(resolve(request.path), 'url_name', '') == 'migrations_notran': + return + return redirect(reverse("ui:migrations_notran")) diff --git a/awx/main/scheduler/tasks.py b/awx/main/scheduler/tasks.py index c0d3dd842e..c695bd08e1 100644 --- a/awx/main/scheduler/tasks.py +++ b/awx/main/scheduler/tasks.py @@ -5,11 +5,15 @@ import logging # AWX from awx.main.scheduler import TaskManager from awx.main.dispatch.publish import task +from awx.main.utils.db import migration_in_progress_check_or_relase logger = logging.getLogger('awx.main.scheduler') @task() def run_task_manager(): + if migration_in_progress_check_or_relase(): + logger.debug("Not running task manager because migration is in progress.") + return logger.debug("Running Tower task manager.") TaskManager().schedule() diff --git a/awx/main/utils/db.py b/awx/main/utils/db.py index f91f2d7b65..88e08ad55f 100644 --- a/awx/main/utils/db.py +++ b/awx/main/utils/db.py @@ -1,8 +1,16 @@ # Copyright (c) 2017 Ansible by Red Hat # All Rights Reserved. +import logging from itertools import chain +from django.core.cache import cache +from django.db.migrations.executor import MigrationExecutor +from django.db import connection + + +logger = logging.getLogger('awx.main.utils.db') + def get_all_field_names(model): # Implements compatibility with _meta.get_all_field_names @@ -14,3 +22,21 @@ def get_all_field_names(model): # GenericForeignKey from the results. if not (field.many_to_one and field.related_model is None) ))) + + +def migration_in_progress_check_or_relase(): + '''A memcache flag is raised (set to True) to inform cluster + that a migration is ongoing see main.apps.MainConfig.ready + if the flag is True then the flag is removed on this instance if + models-db consistency is observed + effective value of migration flag is returned + ''' + migration_in_progress = cache.get('migration_in_progress', False) + if migration_in_progress: + executor = MigrationExecutor(connection) + plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) + if not bool(plan): + logger.info('Detected that migration finished, migration flag taken down.') + cache.delete('migration_in_progress') + migration_in_progress = False + return migration_in_progress