Merge pull request #594 from YunoHost/manual-migration-and-disclaimer-behaviors

[fix] Manual migration and disclaimer behaviors
This commit is contained in:
Alexandre Aubin 2018-12-09 20:46:52 +01:00 committed by GitHub
commit 7b69cb1fb6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 25 deletions

View file

@ -304,6 +304,7 @@
"migrations_show_currently_running_migration": "Running migration {number} {name}...", "migrations_show_currently_running_migration": "Running migration {number} {name}...",
"migrations_show_last_migration": "Last ran migration is {}", "migrations_show_last_migration": "Last ran migration is {}",
"migrations_skip_migration": "Skipping migration {number} {name}...", "migrations_skip_migration": "Skipping migration {number} {name}...",
"migrations_success": "Successfully ran migration {number} {name}!",
"migrations_to_be_ran_manually": "Migration {number} {name} has to be ran manually. Please go to Tools > Migrations on the webadmin, or run `yunohost tools migrations migrate`.", "migrations_to_be_ran_manually": "Migration {number} {name} has to be ran manually. Please go to Tools > Migrations on the webadmin, or run `yunohost tools migrations migrate`.",
"migrations_need_to_accept_disclaimer": "To run the migration {number} {name}, your must accept the following disclaimer:\n---\n{disclaimer}\n---\nIf you accept to run the migration, please re-run the command with the option --accept-disclaimer.", "migrations_need_to_accept_disclaimer": "To run the migration {number} {name}, your must accept the following disclaimer:\n---\n{disclaimer}\n---\nIf you accept to run the migration, please re-run the command with the option --accept-disclaimer.",
"monitor_disabled": "The server monitoring has been disabled", "monitor_disabled": "The server monitoring has been disabled",

View file

@ -434,7 +434,7 @@ def tools_postinstall(operation_logger, domain, password, ignore_dyndns=False,
_install_appslist_fetch_cron() _install_appslist_fetch_cron()
# Init migrations (skip them, no need to run them on a fresh system) # Init migrations (skip them, no need to run them on a fresh system)
tools_migrations_migrate(skip=True, auto=True) _skip_all_migrations()
os.system('touch /etc/yunohost/installed') os.system('touch /etc/yunohost/installed')
@ -874,38 +874,41 @@ def tools_migrations_migrate(target=None, skip=False, auto=False, accept_disclai
else: # can't happen, this case is handle before else: # can't happen, this case is handle before
raise Exception() raise Exception()
# If we are migrating in "automatic mode" (i.e. from debian
# configure during an upgrade of the package) but we are asked to run
# migrations is to be ran manually by the user
manual_migrations = [m for m in migrations if m.mode == "manual"]
if not skip and auto and manual_migrations:
for m in manual_migrations:
logger.warn(m18n.n('migrations_to_be_ran_manually',
number=m.number,
name=m.name))
return
# If some migrations have disclaimers, require the --accept-disclaimer
# option
migrations_with_disclaimer = [m for m in migrations if m.disclaimer]
if not skip and not accept_disclaimer and migrations_with_disclaimer:
for m in migrations_with_disclaimer:
logger.warn(m18n.n('migrations_need_to_accept_disclaimer',
number=m.number,
name=m.name,
disclaimer=m.disclaimer))
return
# effectively run selected migrations # effectively run selected migrations
for migration in migrations: for migration in migrations:
if not skip:
# If we are migrating in "automatic mode" (i.e. from debian configure
# during an upgrade of the package) but we are asked to run migrations
# to be ran manually by the user, stop there and ask the user to
# run the migration manually.
if auto and migration.mode == "manual":
logger.warn(m18n.n('migrations_to_be_ran_manually',
number=migration.number,
name=migration.name))
break
# If some migrations have disclaimers,
if migration.disclaimer:
# require the --accept-disclaimer option. Otherwise, stop everything
# here and display the disclaimer
if not accept_disclaimer:
logger.warn(m18n.n('migrations_need_to_accept_disclaimer',
number=migration.number,
name=migration.name,
disclaimer=migration.disclaimer))
break
# --accept-disclaimer will only work for the first migration
else:
accept_disclaimer = False
# Start register change on system # Start register change on system
operation_logger= OperationLogger('tools_migrations_migrate_' + mode) operation_logger= OperationLogger('tools_migrations_migrate_' + mode)
operation_logger.start() operation_logger.start()
if not skip: if not skip:
logger.warn(m18n.n('migrations_show_currently_running_migration', logger.info(m18n.n('migrations_show_currently_running_migration',
number=migration.number, name=migration.name)) number=migration.number, name=migration.name))
try: try:
@ -926,6 +929,9 @@ def tools_migrations_migrate(target=None, skip=False, auto=False, accept_disclai
logger.error(msg, exc_info=1) logger.error(msg, exc_info=1)
operation_logger.error(msg) operation_logger.error(msg)
break break
else:
logger.success(m18n.n('migrations_success',
number=migration.number, name=migration.name))
else: # if skip else: # if skip
logger.warn(m18n.n('migrations_skip_migration', logger.warn(m18n.n('migrations_skip_migration',
@ -940,13 +946,16 @@ def tools_migrations_migrate(target=None, skip=False, auto=False, accept_disclai
operation_logger.success() operation_logger.success()
# Skip migrations one at a time
if skip:
break
# special case where we want to go back from the start # special case where we want to go back from the start
if target == 0: if target == 0:
state["last_run_migration"] = None state["last_run_migration"] = None
write_to_json(MIGRATIONS_STATE_PATH, state) write_to_json(MIGRATIONS_STATE_PATH, state)
def tools_migrations_state(): def tools_migrations_state():
""" """
Show current migration state Show current migration state
@ -1046,6 +1055,25 @@ def _load_migration(migration_file):
raise MoulinetteError(errno.EINVAL, m18n.n('migrations_error_failed_to_load_migration', raise MoulinetteError(errno.EINVAL, m18n.n('migrations_error_failed_to_load_migration',
number=number, name=name)) number=number, name=name))
def _skip_all_migrations():
"""
Skip all pending migrations.
This is meant to be used during postinstall to
initialize the migration system.
"""
state = tools_migrations_state()
# load all migrations
migrations = _get_migrations_list()
migrations = sorted(migrations, key=lambda x: x.number)
last_migration = migrations[-1]
state["last_run_migration"] = {
"number": last_migration.number,
"name": last_migration.name
}
write_to_json(MIGRATIONS_STATE_PATH, state)
class Migration(object): class Migration(object):