Add proper error handling when the config volume is mounted in a read-only state.
This commit is contained in:
parent
bcd8a48159
commit
036c8e56e0
3 changed files with 23 additions and 3 deletions
|
@ -15,6 +15,7 @@ from auth.permissions import SuperUserPermission
|
||||||
from auth.auth_context import get_authenticated_user
|
from auth.auth_context import get_authenticated_user
|
||||||
from data.database import User
|
from data.database import User
|
||||||
from util.config.configutil import add_enterprise_config_defaults
|
from util.config.configutil import add_enterprise_config_defaults
|
||||||
|
from util.config.provider import CannotWriteConfigException
|
||||||
from util.config.validator import validate_service_for_config, SSL_FILENAMES
|
from util.config.validator import validate_service_for_config, SSL_FILENAMES
|
||||||
from data.runmigration import run_alembic_migration
|
from data.runmigration import run_alembic_migration
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import json
|
||||||
from flask import make_response
|
from flask import make_response
|
||||||
from app import app
|
from app import app
|
||||||
from util.useremails import CannotSendEmailException
|
from util.useremails import CannotSendEmailException
|
||||||
|
from util.config.provider import CannotWriteConfigException
|
||||||
from data import model
|
from data import model
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -17,3 +18,11 @@ def handle_dme(ex):
|
||||||
def handle_emailexception(ex):
|
def handle_emailexception(ex):
|
||||||
message = 'Could not send email. Please contact an administrator and report this problem.'
|
message = 'Could not send email. Please contact an administrator and report this problem.'
|
||||||
return make_response(json.dumps({'message': message}), 400)
|
return make_response(json.dumps({'message': message}), 400)
|
||||||
|
|
||||||
|
@app.errorhandler(CannotWriteConfigException)
|
||||||
|
def handle_configexception(ex):
|
||||||
|
message = ('Configuration could not be written to the mounted volume. \n' +
|
||||||
|
'Please make sure the mounted volume is not read-only and restart ' +
|
||||||
|
'the setup process. \n\nIssue: %s' % ex)
|
||||||
|
|
||||||
|
return make_response(json.dumps({'message': message}), 400)
|
|
@ -6,6 +6,10 @@ from StringIO import StringIO
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class CannotWriteConfigException(Exception):
|
||||||
|
""" Exception raised when the config cannot be written. """
|
||||||
|
pass
|
||||||
|
|
||||||
def _import_yaml(config_obj, config_file):
|
def _import_yaml(config_obj, config_file):
|
||||||
with open(config_file) as f:
|
with open(config_file) as f:
|
||||||
c = yaml.safe_load(f)
|
c = yaml.safe_load(f)
|
||||||
|
@ -24,8 +28,11 @@ def _import_yaml(config_obj, config_file):
|
||||||
|
|
||||||
|
|
||||||
def _export_yaml(config_obj, config_file):
|
def _export_yaml(config_obj, config_file):
|
||||||
with open(config_file, 'w') as f:
|
try:
|
||||||
f.write(yaml.safe_dump(config_obj, encoding='utf-8', allow_unicode=True))
|
with open(config_file, 'w') as f:
|
||||||
|
f.write(yaml.safe_dump(config_obj, encoding='utf-8', allow_unicode=True))
|
||||||
|
except IOError as ioe:
|
||||||
|
raise CannotWriteConfigException(str(ioe))
|
||||||
|
|
||||||
|
|
||||||
class BaseProvider(object):
|
class BaseProvider(object):
|
||||||
|
@ -116,7 +123,10 @@ class FileConfigProvider(BaseProvider):
|
||||||
return open(os.path.join(self.config_volume, filename), mode)
|
return open(os.path.join(self.config_volume, filename), mode)
|
||||||
|
|
||||||
def save_volume_file(self, filename, flask_file):
|
def save_volume_file(self, filename, flask_file):
|
||||||
flask_file.save(os.path.join(self.config_volume, filename))
|
try:
|
||||||
|
flask_file.save(os.path.join(self.config_volume, filename))
|
||||||
|
except IOError as ioe:
|
||||||
|
raise CannotWriteConfigException(str(ioe))
|
||||||
|
|
||||||
def requires_restart(self, app_config):
|
def requires_restart(self, app_config):
|
||||||
file_config = self.get_yaml()
|
file_config = self.get_yaml()
|
||||||
|
|
Reference in a new issue