|
@ -0,0 +1,35 @@ |
|
|
|
|
|
import sys |
|
|
|
|
|
import time |
|
|
|
|
|
|
|
|
|
|
|
from django.db import connection |
|
|
|
|
|
from django.db.utils import OperationalError |
|
|
|
|
|
from django.core.management.base import BaseCommand |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Command(BaseCommand): |
|
|
|
|
|
help = 'Blocks until the database is available' |
|
|
|
|
|
|
|
|
|
|
|
def add_arguments(self, parser): |
|
|
|
|
|
parser.add_argument('--poll_seconds', type=float, default=3) |
|
|
|
|
|
parser.add_argument('--max_retries', type=int, default=60) |
|
|
|
|
|
|
|
|
|
|
|
def handle(self, *args, **options): |
|
|
|
|
|
max_retries = options['max_retries'] |
|
|
|
|
|
poll_seconds = options['poll_seconds'] |
|
|
|
|
|
|
|
|
|
|
|
for retry in range(max_retries): |
|
|
|
|
|
try: |
|
|
|
|
|
connection.ensure_connection() |
|
|
|
|
|
except OperationalError as ex: |
|
|
|
|
|
self.stdout.write( |
|
|
|
|
|
'Database unavailable on attempt {attempt}/{max_retries}:' |
|
|
|
|
|
' {error}'.format( |
|
|
|
|
|
attempt=retry + 1, |
|
|
|
|
|
max_retries=max_retries, |
|
|
|
|
|
error=ex)) |
|
|
|
|
|
time.sleep(poll_seconds) |
|
|
|
|
|
else: |
|
|
|
|
|
break |
|
|
|
|
|
else: |
|
|
|
|
|
self.stdout.write(self.style.ERROR('Database unavailable')) |
|
|
|
|
|
sys.exit(1) |