From 165fcae798f8162af2ade5b47487e8b2f011f7d2 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Mon, 8 Jun 2020 08:14:21 -0400 Subject: [PATCH] upgrade: restore original config after upgrade Signed-off-by: Michal Mielewczyk --- utils/upgrade | 52 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/utils/upgrade b/utils/upgrade index 3367815..1beeafb 100755 --- a/utils/upgrade +++ b/utils/upgrade @@ -10,6 +10,7 @@ import argparse import subprocess import os from pathlib import Path +from shutil import copy import opencas from upgrade_utils import ( @@ -30,6 +31,7 @@ from upgrade_utils import ( LOG_FILE = "/var/log/opencas-upgrade/upgrade.log" COMPILATION_LOG = "/var/log/opencas-upgrade/build.log" +INIT_CONFIG_FILE_TMP_PATH = "/tmp/opencas_upgrade_backup.conf" CAS_CACHE_KEY = "CAS Cache Kernel Module" CAS_DISK_KEY = "CAS Disk Kernel Module" @@ -76,6 +78,14 @@ class InitUpgrade(UpgradeState): if len(active_devices["core_pool"]) != 0: return Failure("Incomplete configuration. Run casadm -L to review CAS state!") + if os.path.isfile(opencas.cas_config.default_location): + try: + copy(opencas.cas_config.default_location, INIT_CONFIG_FILE_TMP_PATH) + except IOError: + return Failure("Could not save init config file backup") + else: + logging.info("Init config file not found") + return Success() @@ -101,6 +111,25 @@ class BuildCas(UpgradeState): return Success() +class RestoreInitConfig(UpgradeState): + log = "Restore original init config file" + + def do_work(self): + if not os.path.isfile(INIT_CONFIG_FILE_TMP_PATH): + logging.warning("Init config backup file not found") + return Success() + + try: + copy(INIT_CONFIG_FILE_TMP_PATH, opencas.cas_config.default_location) + except IOError: + logging.error(f"Failed to restore original init config file from " + f"{INIT_CONFIG_FILE_TMP_PATH}. Configuration has to be restored manually.") + return Failure() + + os.remove(INIT_CONFIG_FILE_TMP_PATH) + return Success() + + class InstallCas(UpgradeState): log = "Installing new Open CAS files" @@ -309,15 +338,21 @@ class UpgradeStateMachine(StateMachine): +------+------+ fail | | | |InsertNew +--------+ | | +------+------+ | | | - | | | | - v v | | - +------+------+ +------+--------+ | | - |InstallCas | |InsertInstalled| | | - +------+------+ +------+--------+ | | | | | | v | | | + +------+------+ fail | | | + |InstallCas +--------+ | | + +------+------+ v | | + | +------+--------+ | | + | |InsertInstalled| | | + v +------+--------+ | | +------+------+ | | | - |RestoreSched +<-------+----------+ | + |RestoreConfig+<-------+ | | + +------+------+ | | + | | | + v | | + +------+------+ | | + |RestoreSched +<------------------+ | +------+------+ v | +------+---+ +---------------------->+ END | @@ -335,8 +370,9 @@ class UpgradeStateMachine(StateMachine): DropCaches: {Success: DryRun, Failure: RestoreCoreSchedulers}, DryRun: {Success: InsertNewModule, Failure: InsertInstalledModule}, InsertNewModule: {Success: InstallCas, Failure: InsertInstalledModule}, - InstallCas: {Success: RestoreCoreSchedulers, Failure: InsertInstalledModule}, - InsertInstalledModule: {"default": RestoreCoreSchedulers}, + InstallCas: {Success: RestoreInitConfig, Failure: InsertInstalledModule}, + InsertInstalledModule: {"default": RestoreInitConfig}, + RestoreInitConfig: {"default": RestoreCoreSchedulers}, RestoreCoreSchedulers: {"default": None}, "default": None, }