def rollback(self, marqo_version: str) -> None:
        """
        Rollback the Vespa application package to match the current Marqo version. This will
        1. Check if rollback is feasible (version matches, backup file exists and no irreversible changes)
        2. Recover the files from backup and remove the added files (marked as removal in backup)
        3. Create a backup of this rollback
        """
        vespa_app_version = self.get_marqo_config().version
        marqo_sem_version = semver.VersionInfo.parse(marqo_version, optional_minor_and_patch=True)
        app_sem_version = semver.VersionInfo.parse(vespa_app_version, optional_minor_and_patch=True)
        if marqo_sem_version >= app_sem_version:
            raise ApplicationRollbackError(f"Cannot rollback from ${app_sem_version} to ${marqo_sem_version}. "
                                           f"The target version must be lower than the current one.")

        if not self._store.file_exists(self._BACKUP_FILE):
            raise ApplicationRollbackError(f"{self._BACKUP_FILE} does not exist in current session, failed to rollback")

        old_backup = VespaAppBackup(self._store.read_binary_file(self._BACKUP_FILE))
        logger.debug(f'Old backup {old_backup}')

        marqo_config = MarqoConfigStore(old_backup.read_text_file(self._MARQO_CONFIG_FILE)).get()
        if marqo_config is not None and marqo_config.version != marqo_version:
            raise ApplicationRollbackError(f"Cannot rollback to {marqo_config.version}, current Marqo version is {marqo_version}")

        logger.info(f'Rolling the vector store back from {vespa_app_version} to {marqo_version}')

        # Copy components jar files from the old Marqo version
        self._copy_components_jar()

        new_backup = VespaAppBackup()
        for paths in old_backup.files_to_remove():
            logger.debug(f'Removing file {paths}')
            self._store.remove_file(*paths, backup=new_backup)

        for (path, file_content) in old_backup.files_to_rollback():
            logger.debug(f'Rolling back file {path}')
            if path == self._SERVICES_XML_FILE:
                self._validate_services_xml_for_rollback(file_content.decode('utf-8'))
            self._store.save_file(file_content, path, backup=new_backup)

        logger.debug(f'Generating backup file {self._BACKUP_FILE} from {new_backup}')
        self._store.save_file(new_backup.to_zip_stream().read(), self._BACKUP_FILE)
        self._deploy()

        Rollback the Vespa application package to match the current Marqo version. This will
        1. Check if rollback is feasible (version matches, backup file exists and no irreversible changes)
        2. Recover the files from backup and remove the added files (marked as removal in backup)
        3. Create a backup of this rollback
        
src/marqo/core/index_management/vespa_application_package.py