Fix metadata storage

After recent changes BackupJob.get_metadata also returns information about storage.
But before this patch, I was replacing conf.storage from string (swift, local, ssh) to actual object (SwiftStorage, LocalStorage, SshStorage).
So in get_metadata we were trying to serialize object instead of string.
 This patch fixes that by leaving conf.storage as a string and providing to Job storage as dedicated parameter.

Change-Id: I0869b7d432e8f8a7f0839e4670a8845bf932e69c
This commit is contained in:
eldar nugaev 2015-11-17 15:43:08 +00:00
parent 3490ec61b4
commit 5d577d043a
4 changed files with 40 additions and 42 deletions

View File

@ -32,7 +32,7 @@ from freezer.winutils import is_windows
home = expanduser("~") home = expanduser("~")
def backup_mode_sql_server(backup_opt_dict): def backup_mode_sql_server(backup_opt_dict, storage):
""" """
Execute a SQL Server DB backup. Currently only backups with shadow Execute a SQL Server DB backup. Currently only backups with shadow
copy are supported. This mean, as soon as the shadow copy is created copy are supported. This mean, as soon as the shadow copy is created
@ -60,8 +60,7 @@ def backup_mode_sql_server(backup_opt_dict):
try: try:
stop_sql_server(backup_opt_dict.sql_server_instance) stop_sql_server(backup_opt_dict.sql_server_instance)
backup(backup_opt_dict, backup_opt_dict.storage, backup(backup_opt_dict, storage, backup_opt_dict.engine)
backup_opt_dict.engine)
finally: finally:
if not backup_opt_dict.vssadmin: if not backup_opt_dict.vssadmin:
# if vssadmin is false, wait until the backup is complete # if vssadmin is false, wait until the backup is complete
@ -69,7 +68,7 @@ def backup_mode_sql_server(backup_opt_dict):
start_sql_server(backup_opt_dict.sql_server_instance) start_sql_server(backup_opt_dict.sql_server_instance)
def backup_mode_mysql(backup_opt_dict): def backup_mode_mysql(backup_opt_dict, storage):
""" """
Execute a MySQL DB backup. currently only backup with lvm snapshots Execute a MySQL DB backup. currently only backup with lvm snapshots
are supported. This mean, just before the lvm snap vol is created, are supported. This mean, just before the lvm snap vol is created,
@ -132,10 +131,10 @@ def backup_mode_mysql(backup_opt_dict):
raise Exception('[*] MySQL: {0}'.format(error)) raise Exception('[*] MySQL: {0}'.format(error))
# Execute backup # Execute backup
backup(backup_opt_dict, backup_opt_dict.storage, backup_opt_dict.engine) backup(backup_opt_dict, storage, backup_opt_dict.engine)
def backup_mode_mongo(backup_opt_dict): def backup_mode_mongo(backup_opt_dict, storage):
""" """
Execute the necessary tasks for file system backup mode Execute the necessary tasks for file system backup mode
""" """
@ -156,8 +155,7 @@ def backup_mode_mongo(backup_opt_dict):
mongo_primary = master_dict['primary'] mongo_primary = master_dict['primary']
if mongo_me == mongo_primary: if mongo_me == mongo_primary:
backup(backup_opt_dict, backup_opt_dict.storage, backup(backup_opt_dict, storage, backup_opt_dict.engine)
backup_opt_dict.engine)
else: else:
logging.warning('[*] localhost {0} is not Master/Primary,\ logging.warning('[*] localhost {0} is not Master/Primary,\
exiting...'.format(local_hostname)) exiting...'.format(local_hostname))

View File

@ -33,9 +33,9 @@ class Job:
:type engine: freezer.engine.engine.BackupEngine :type engine: freezer.engine.engine.BackupEngine
""" """
def __init__(self, conf_dict): def __init__(self, conf_dict, storage):
self.conf = conf_dict self.conf = conf_dict
self.storage = conf_dict.storage self.storage = storage
self.engine = conf_dict.engine self.engine = conf_dict.engine
def execute(self): def execute(self):
@ -77,16 +77,16 @@ class BackupJob(Job):
logging.error('Error while sync exec: {0}'.format(err)) logging.error('Error while sync exec: {0}'.format(err))
except Exception as error: except Exception as error:
logging.error('Error while sync exec: {0}'.format(error)) logging.error('Error while sync exec: {0}'.format(error))
self.conf.storage.prepare() self.storage.prepare()
if self.conf.mode == 'fs': if self.conf.mode == 'fs':
backup.backup(self.conf, self.storage, self.engine) backup.backup(self.conf, self.storage, self.engine)
elif self.conf.mode == 'mongo': elif self.conf.mode == 'mongo':
backup.backup_mode_mongo(self.conf) backup.backup_mode_mongo(self.conf, self.storage)
elif self.conf.mode == 'mysql': elif self.conf.mode == 'mysql':
backup.backup_mode_mysql(self.conf) backup.backup_mode_mysql(self.conf, self.storage)
elif self.conf.mode == 'sqlserver': elif self.conf.mode == 'sqlserver':
backup.backup_mode_sql_server(self.conf) backup.backup_mode_sql_server(self.conf, self.storage)
else: else:
raise ValueError('Please provide a valid backup mode') raise ValueError('Please provide a valid backup mode')
@ -169,15 +169,15 @@ class ExecJob(Job):
return True return True
def create_job(conf): def create_job(conf, storage):
if conf.action == 'backup': if conf.action == 'backup':
return BackupJob(conf) return BackupJob(conf, storage)
if conf.action == 'restore': if conf.action == 'restore':
return RestoreJob(conf) return RestoreJob(conf, storage)
if conf.action == 'info': if conf.action == 'info':
return InfoJob(conf) return InfoJob(conf, storage)
if conf.action == 'admin': if conf.action == 'admin':
return AdminJob(conf) return AdminJob(conf, storage)
if conf.action == 'exec': if conf.action == 'exec':
return ExecJob(conf) return ExecJob(conf, storage)
raise Exception('Action "{0}" not supported'.format(conf.action)) raise Exception('Action "{0}" not supported'.format(conf.action))

View File

@ -130,7 +130,6 @@ def freezer_main(backup_args, arg_parse):
else: else:
raise Exception("Not storage found for name " + backup_args.storage) raise Exception("Not storage found for name " + backup_args.storage)
backup_args.__dict__['storage'] = storage
backup_args.__dict__['engine'] = tar_engine.TarBackupEngine( backup_args.__dict__['engine'] = tar_engine.TarBackupEngine(
backup_args.compression, backup_args.compression,
backup_args.dereference_symlink, backup_args.dereference_symlink,
@ -145,7 +144,7 @@ def freezer_main(backup_args, arg_parse):
if int(os.environ.get("tricklecount")) > 1: if int(os.environ.get("tricklecount")) > 1:
logging.critical("[*] Trickle seems to be not working," logging.critical("[*] Trickle seems to be not working,"
" Switching to normal mode ") " Switching to normal mode ")
run_job(backup_args) run_job(backup_args, storage)
freezer_command = '{0} {1}'.format(backup_args.trickle_command, freezer_command = '{0} {1}'.format(backup_args.trickle_command,
' '.join(sys.argv)) ' '.join(sys.argv))
@ -160,14 +159,14 @@ def freezer_main(backup_args, arg_parse):
if process.returncode: if process.returncode:
logging.error("[*] Trickle Error: {0}".format(error)) logging.error("[*] Trickle Error: {0}".format(error))
logging.critical("[*] Switching to work without trickle ...") logging.critical("[*] Switching to work without trickle ...")
run_job(backup_args) run_job(backup_args, storage)
else: else:
run_job(backup_args) run_job(backup_args, storage)
def run_job(backup_args): def run_job(backup_args, storage):
freezer_job = job.create_job(backup_args) freezer_job = job.create_job(backup_args, storage)
freezer_job.execute() freezer_job.execute()
if backup_args.metadata_out == '-': if backup_args.metadata_out == '-':

View File

@ -30,7 +30,8 @@ class TestJob(unittest.TestCase):
fakebackup = FakeBackup() fakebackup = FakeBackup()
def test_execute(self): def test_execute(self):
job = Job(BackupOpt1()) opt = BackupOpt1()
job = Job(opt, opt.storage)
assert job.execute() is None assert job.execute() is None
@ -38,13 +39,13 @@ class TestInfoJob(TestJob):
def test_execute_nothing_to_do(self): def test_execute_nothing_to_do(self):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
job = InfoJob(backup_opt) job = InfoJob(backup_opt, backup_opt.storage)
job.execute() job.execute()
def test_execute_list_containers(self): def test_execute_list_containers(self):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.list_containers = True backup_opt.list_containers = True
job = InfoJob(backup_opt) job = InfoJob(backup_opt, backup_opt.storage)
job.execute() job.execute()
@ -54,7 +55,7 @@ class TestBackupJob(TestJob):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.mode = 'fs' backup_opt.mode = 'fs'
backup_opt.no_incremental = True backup_opt.no_incremental = True
job = BackupJob(backup_opt) job = BackupJob(backup_opt, backup_opt.storage)
self.assertRaises(Exception, job.execute) self.assertRaises(Exception, job.execute)
def test_execute_backup_mongo(self): def test_execute_backup_mongo(self):
@ -62,7 +63,7 @@ class TestBackupJob(TestJob):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.no_incremental = False backup_opt.no_incremental = False
backup_opt.mode = 'mongo' backup_opt.mode = 'mongo'
job = BackupJob(backup_opt) job = BackupJob(backup_opt, backup_opt.storage)
assert job.execute() is None assert job.execute() is None
def test_execute_backup_mysql(self): def test_execute_backup_mysql(self):
@ -70,21 +71,21 @@ class TestBackupJob(TestJob):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.no_incremental = False backup_opt.no_incremental = False
backup_opt.mode = 'mysql' backup_opt.mode = 'mysql'
job = BackupJob(backup_opt) job = BackupJob(backup_opt, backup_opt.storage)
assert job.execute() is None assert job.execute() is None
def test_execute_raise(self): def test_execute_raise(self):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.no_incremental = False backup_opt.no_incremental = False
backup_opt.mode = None backup_opt.mode = None
job = BackupJob(backup_opt) job = BackupJob(backup_opt, backup_opt.storage)
self.assertRaises(ValueError, job.execute) self.assertRaises(ValueError, job.execute)
class TestAdminJob(TestJob): class TestAdminJob(TestJob):
def test_execute(self): def test_execute(self):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
job = AdminJob(backup_opt) job = AdminJob(backup_opt, backup_opt.storage)
assert job.execute() is None assert job.execute() is None
@ -103,14 +104,14 @@ class TestExecJob(TestJob):
def test_execute_nothing_to_do(self): def test_execute_nothing_to_do(self):
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
job = ExecJob(backup_opt) job = ExecJob(backup_opt, backup_opt.storage)
assert job.execute() is False assert job.execute() is False
def test_execute_script(self): def test_execute_script(self):
self.mock_popen.return_value.returncode = 0 self.mock_popen.return_value.returncode = 0
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.command='echo test' backup_opt.command='echo test'
job = ExecJob(backup_opt) job = ExecJob(backup_opt, backup_opt.storage)
assert job.execute() is True assert job.execute() is True
def test_execute_raise(self): def test_execute_raise(self):
@ -119,7 +120,7 @@ class TestExecJob(TestJob):
self.mock_popen.return_value.returncode = 1 self.mock_popen.return_value.returncode = 1
backup_opt = BackupOpt1() backup_opt = BackupOpt1()
backup_opt.command = 'echo test' backup_opt.command = 'echo test'
job = ExecJob(backup_opt) job = ExecJob(backup_opt, backup_opt.storage)
self.assertRaises(Exception, job.execute) self.assertRaises(Exception, job.execute)
def test_create_job(self): def test_create_job(self):
@ -128,21 +129,21 @@ class TestExecJob(TestJob):
self.assertRaises(Exception, create_job, backup_opt) self.assertRaises(Exception, create_job, backup_opt)
backup_opt.action = 'backup' backup_opt.action = 'backup'
job = create_job(backup_opt) job = create_job(backup_opt, backup_opt.storage)
assert isinstance(job, BackupJob) assert isinstance(job, BackupJob)
backup_opt.action = 'restore' backup_opt.action = 'restore'
job = create_job(backup_opt) job = create_job(backup_opt, backup_opt.storage)
assert isinstance(job, RestoreJob) assert isinstance(job, RestoreJob)
backup_opt.action = 'info' backup_opt.action = 'info'
job = create_job(backup_opt) job = create_job(backup_opt, backup_opt.storage)
assert isinstance(job, InfoJob) assert isinstance(job, InfoJob)
backup_opt.action = 'admin' backup_opt.action = 'admin'
job = create_job(backup_opt) job = create_job(backup_opt, backup_opt.storage)
assert isinstance(job, AdminJob) assert isinstance(job, AdminJob)
backup_opt.action = 'exec' backup_opt.action = 'exec'
job = create_job(backup_opt) job = create_job(backup_opt, backup_opt.storage)
assert isinstance(job, ExecJob) assert isinstance(job, ExecJob)