def test_backup_binds_are_readonly(mocker, monkeypatch): def custom_mount_and_backup(self): self._organize_files() confssh = os.path.join(self.work_dir, "conf/ssh") output = subprocess.check_output( "touch %s/test 2>&1 || true" % confssh, shell=True, env={"LANG": "en_US.UTF-8"}, ) output = output.decode() assert "Read-only file system" in output if not _recursive_umount(self.work_dir): raise Exception("Backup cleaning failed !") self.clean() monkeypatch.setattr( "yunohost.backup.BackupMethod.mount_and_backup", custom_mount_and_backup ) # Create the backup with message(mocker, "backup_created"): backup_create(system=[])
def _test_backup_and_restore_app(mocker, app): # Create a backup of this app with message(mocker, "backup_created"): backup_create(system=None, apps=[app]) archives = backup_list()["archives"] assert len(archives) == 1 archives_info = backup_info(archives[0], with_details=True) assert archives_info["system"] == {} assert len(archives_info["apps"].keys()) == 1 assert app in archives_info["apps"].keys() # Uninstall the app app_remove(app) assert not app_is_installed(app) assert app + ".main" not in user_permission_list()["permissions"] # Restore the app with message(mocker, "restore_complete"): backup_restore(system=None, name=archives[0], apps=[app]) assert app_is_installed(app) # Check permission per_list = user_permission_list()["permissions"] assert app + ".main" in per_list
def test_backup_and_restore_all_sys(mocker): # Create the backup with message(mocker, "backup_created"): backup_create(system=[], apps=None) archives = backup_list()["archives"] assert len(archives) == 1 archives_info = backup_info(archives[0], with_details=True) assert archives_info["apps"] == {} assert len(archives_info["system"].keys()) == len( os.listdir("/usr/share/yunohost/hooks/backup/") ) # Remove ssowat conf assert os.path.exists("/etc/ssowat/conf.json") os.system("rm -rf /etc/ssowat/") assert not os.path.exists("/etc/ssowat/conf.json") # Restore the backup with message(mocker, "restore_complete"): backup_restore(name=archives[0], force=True, system=[], apps=None) # Check ssowat conf is back assert os.path.exists("/etc/ssowat/conf.json")
def test_backup_app_not_installed(mocker): assert not _is_installed("wordpress") with message(mocker, "unbackup_app", app="wordpress"): with raiseYunohostError(mocker, "backup_nothings_done"): backup_create(system=None, apps=["wordpress"])
def test_backup_app_with_no_backup_script(mocker): backup_script = "/etc/yunohost/apps/backup_recommended_app/scripts/backup" os.system("rm %s" % backup_script) assert not os.path.exists(backup_script) with message( mocker, "backup_with_no_backup_script_for_app", app="backup_recommended_app" ): with raiseYunohostError(mocker, "backup_nothings_done"): backup_create(system=None, apps=["backup_recommended_app"])
def test_backup_using_copy_method(mocker): # Create the backup with message(mocker, "backup_created"): backup_create(system=["conf_nginx"], apps=None, output_directory="/opt/test_backup_output_directory", methods=["copy"], name="backup") assert os.path.exists("/opt/test_backup_output_directory/info.json")
def test_backup_app_with_no_restore_script(mocker): restore_script = "/etc/yunohost/apps/backup_recommended_app/scripts/restore" os.system("rm %s" % restore_script) assert not os.path.exists(restore_script) # Backuping an app with no restore script will only display a warning to the # user... with message( mocker, "backup_with_no_restore_script_for_app", app="backup_recommended_app" ): backup_create(system=None, apps=["backup_recommended_app"])
def test_backup_only_ldap(mocker): # Create the backup with message(mocker, "backup_created"): backup_create(system=["conf_ldap"], apps=None) archives = backup_list()["archives"] assert len(archives) == 1 archives_info = backup_info(archives[0], with_details=True) assert archives_info["apps"] == {} assert len(archives_info["system"].keys()) == 1 assert "conf_ldap" in archives_info["system"].keys()
def test_backup_not_enough_free_space(monkeypatch, mocker): def custom_disk_usage(path): return 99999999999999999 def custom_free_space_in_directory(dirpath): return 0 monkeypatch.setattr("yunohost.backup.disk_usage", custom_disk_usage) monkeypatch.setattr("yunohost.backup.free_space_in_directory", custom_free_space_in_directory) with raiseYunohostError(mocker, 'not_enough_disk_space'): backup_create(system=None, apps=["backup_recommended_app"])
def test_backup_script_failure_handling(monkeypatch, mocker): def custom_hook_exec(name, *args, **kwargs): if os.path.basename(name).startswith("backup_"): raise Exception else: return True # Create a backup of this app and simulate a crash (patching the backup # call with monkeypatch). We also patch m18n to check later it's been called # with the expected error message key monkeypatch.setattr("yunohost.backup.hook_exec", custom_hook_exec) with message(mocker, "backup_app_failed", app="backup_recommended_app"): with raiseYunohostError(mocker, "backup_nothings_done"): backup_create(system=None, apps=["backup_recommended_app"])
def test_restore_archive_with_custom_hook(mocker): custom_restore_hook_folder = os.path.join(CUSTOM_HOOK_FOLDER, "restore") os.system("touch %s/99-yolo" % custom_restore_hook_folder) # Backup with custom hook system with message(mocker, "backup_created"): backup_create(system=[], apps=None) archives = backup_list()["archives"] assert len(archives) == 1 # Restore system with custom hook with message(mocker, "restore_complete"): backup_restore( name=backup_list()["archives"][0], system=[], apps=None, force=True ) os.system("rm %s/99-yolo" % custom_restore_hook_folder)
def test_backup_with_different_output_directory(mocker): # Create the backup with message(mocker, "backup_created"): backup_create(system=["conf_ssh"], apps=None, output_directory="/opt/test_backup_output_directory", name="backup") assert os.path.exists("/opt/test_backup_output_directory/backup.tar") archives = backup_list()["archives"] assert len(archives) == 1 archives_info = backup_info(archives[0], with_details=True) assert archives_info["apps"] == {} assert len(archives_info["system"].keys()) == 1 assert "conf_ssh" in archives_info["system"].keys()
def test_restore_system_from_Ynh2p4(monkeypatch, mocker): # Backup current system with message(mocker, "backup_created"): backup_create(system=[], apps=None) archives = backup_list()["archives"] assert len(archives) == 2 # Restore system archive from 2.4 try: with message(mocker, "restore_complete"): backup_restore( name=backup_list()["archives"][1], system=[], apps=None, force=True ) finally: # Restore system as it was backup_restore( name=backup_list()["archives"][0], system=[], apps=None, force=True )
def test_backup_system_part_that_does_not_exists(mocker): # Create the backup with message(mocker, "backup_hook_unknown", hook="doesnt_exist"): with raiseYunohostError(mocker, "backup_nothings_done"): backup_create(system=["doesnt_exist"], apps=None)