def run_mongo_restore(self, restore, destination_uri, dump_dir, source_database_name, log_file_name, dump_log_file_name, exclude_system_users=None, exclude_admin_system_users=None, exclude_system_roles=None, options=None): if source_database_name: source_dir = os.path.join(dump_dir, source_database_name) else: source_dir = dump_dir workspace = self.get_task_workspace_dir(restore) # IMPORTANT delete dump log file so the restore command would not break dump_log_path = os.path.join(workspace, dump_dir, dump_log_file_name) if os.path.exists(dump_log_path): os.remove(dump_log_path) if exclude_system_users: self._delete_system_users_from_dump(restore, source_dir) if exclude_admin_system_users: self._delete_admin_system_users_from_dump(restore, source_dir) if exclude_system_roles: self._delete_roles_from_dump(restore, source_dir) working_dir = workspace log_path = os.path.join(workspace, log_file_name) restore_cmd = [ which("mongoctl"), "restore", destination_uri, source_dir ] if options: restore_cmd.extend(options) restore_cmd_display = restore_cmd[:] restore_cmd_display[restore_cmd_display.index("restore") + 1] = mask_mongo_uri(destination_uri) logger.info("Running mongoctl restore command: %s" % " ".join(restore_cmd_display)) returncode = execute_command_wrapper(restore_cmd, output_path=log_path, cwd=working_dir) # read the last dump log line last_line_tail_cmd = [which('tail'), '-1', log_path] last_log_line = execute_command(last_line_tail_cmd) if returncode: raise RestoreError(returncode, last_log_line)
def dump_backup(self, backup, uri, destination, log_file_name, options=None): mongoctl_exe = which("mongoctl") if not mongoctl_exe: raise MBSError("mongoctl exe not found in PATH") dump_cmd = [mongoctl_exe, "--noninteractive", "dump", uri, "-o", destination] if options: dump_cmd.extend(options) dump_cmd_display = dump_cmd[:] # mask mongo uri dump_cmd_display[3] = mask_mongo_uri(uri) logger.info("Running dump command: %s" % " ".join(dump_cmd_display)) workspace = self.get_task_workspace_dir(backup) log_path = os.path.join(workspace, destination, log_file_name) last_error_line = {"line": ""} def capture_last_error(line): if is_mongo_error_log_line(line): last_error_line["line"] = line # execute dump command return_code = execute_command_wrapper(dump_cmd, cwd=workspace, output_path=log_path, on_output=capture_last_error) # raise an error if return code is not 0 if return_code: errors.raise_dump_error(return_code, last_error_line["line"])
def dump_backup(self, backup, uri, destination, log_file_name, options=None): mongoctl_exe = which("mongoctl") if not mongoctl_exe: raise MBSError("mongoctl exe not found in PATH") dump_cmd = [ mongoctl_exe, "--noninteractive", "dump", uri, "-o", destination ] if options: dump_cmd.extend(options) dump_cmd_display = dump_cmd[:] # mask mongo uri dump_cmd_display[3] = mask_mongo_uri(uri) logger.info("Running dump command: %s" % " ".join(dump_cmd_display)) workspace = self.get_task_workspace_dir(backup) log_path = os.path.join(workspace, destination, log_file_name) last_error_line = {"line": ""} def capture_last_error(line): if is_mongo_error_log_line(line): last_error_line["line"] = line # execute dump command return_code = execute_command_wrapper(dump_cmd, cwd=workspace, output_path=log_path, on_output=capture_last_error) # raise an error if return code is not 0 if return_code: errors.raise_dump_error(return_code, last_error_line["line"])