From babdc4ac905a8ceb501c25dfddabb878f120e8d2 Mon Sep 17 00:00:00 2001 From: Ben Galewsky Date: Thu, 8 Jun 2023 16:15:00 -0500 Subject: [PATCH 001/467] Clear out 1.0 implementation --- pytest.ini | 4 - scripts/.flake8 | 2 - scripts/run_test.py | 54 - scripts/test_jupyter_environment.ipynb | 168 -- servicex/ConfigSettings.py | 55 - servicex/__init__.py | 15 - servicex/cache.py | 515 ----- servicex/config_default.yaml | 43 - servicex/data_conversions.py | 185 -- servicex/minio_adaptor.py | 232 -- servicex/servicex.py | 1120 ---------- servicex/servicex_adaptor.py | 276 --- servicex/servicex_config.py | 221 -- servicex/servicex_python_function.py | 68 - servicex/servicex_utils.py | 60 - servicex/servicexabc.py | 182 -- servicex/utils.py | 695 ------ setup.py | 91 - tests/.flake8 | 3 - tests/__init__.py | 0 tests/conftest.py | 245 --- tests/sample_root_servicex_output.root | Bin 1398775 -> 0 bytes tests/sample_uproot_servicex_output.parquet | Bin 3374797 -> 0 bytes tests/test_ConfigSettings.py | 106 - tests/test_cache.py | 462 ---- tests/test_data_conversions.py | 148 -- tests/test_minio_adaptor.py | 292 --- tests/test_servicex.py | 2120 ------------------- tests/test_servicex_adaptor.py | 592 ------ tests/test_servicex_config.py | 401 ---- tests/test_servicexabc.py | 7 - tests/test_utils.py | 727 ------- 32 files changed, 9089 deletions(-) delete mode 100644 pytest.ini delete mode 100644 scripts/.flake8 delete mode 100644 scripts/run_test.py delete mode 100644 scripts/test_jupyter_environment.ipynb delete mode 100644 servicex/ConfigSettings.py delete mode 100644 servicex/__init__.py delete mode 100644 servicex/cache.py delete mode 100644 servicex/config_default.yaml delete mode 100644 servicex/data_conversions.py delete mode 100644 servicex/minio_adaptor.py delete mode 100644 servicex/servicex.py delete mode 100644 servicex/servicex_adaptor.py delete mode 100644 servicex/servicex_config.py delete mode 100644 servicex/servicex_python_function.py delete mode 100644 servicex/servicex_utils.py delete mode 100644 servicex/servicexabc.py delete mode 100644 servicex/utils.py delete mode 100644 setup.py delete mode 100644 tests/.flake8 delete mode 100644 tests/__init__.py delete mode 100644 tests/conftest.py delete mode 100644 tests/sample_root_servicex_output.root delete mode 100644 tests/sample_uproot_servicex_output.parquet delete mode 100644 tests/test_ConfigSettings.py delete mode 100644 tests/test_cache.py delete mode 100644 tests/test_data_conversions.py delete mode 100644 tests/test_minio_adaptor.py delete mode 100644 tests/test_servicex.py delete mode 100644 tests/test_servicex_adaptor.py delete mode 100644 tests/test_servicex_config.py delete mode 100644 tests/test_servicexabc.py delete mode 100644 tests/test_utils.py diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index ea269d07..00000000 --- a/pytest.ini +++ /dev/null @@ -1,4 +0,0 @@ -[pytest] -; addopts = --ignore=setup.py --cov=servicex --cov-report=term-missing --cov-config=.coveragerc --cov-report xml -junit_family=xunit1 -asyncio_mode = auto \ No newline at end of file diff --git a/scripts/.flake8 b/scripts/.flake8 deleted file mode 100644 index 2c51e6a3..00000000 --- a/scripts/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -max-line-length = 10000 diff --git a/scripts/run_test.py b/scripts/run_test.py deleted file mode 100644 index 582dbefc..00000000 --- a/scripts/run_test.py +++ /dev/null @@ -1,54 +0,0 @@ -# Tests against a ServiceX instance. This is not meant to be a complete -# test of every code path. Just a sanity check. The unit tests are meant to -# do that sort of testing. -# An example endpoint (pass as arg to this script): -# http://localhost:5000 -import argparse -import asyncio - -from servicex import ServiceXDataset - - -async def run_query(endpoint: str, dest: str) -> None: - ds = ServiceXDataset( - "mc16_13TeV:mc16_13TeV.361106.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zee.deriv.DAOD_STDM3.e3601_e5984_s3126_r10201_r10210_p3975_tid20425969_00", # NOQA - backend_name=endpoint, - max_workers=100) - - request = "(call ResultTTree (call Select (call SelectMany (call EventDataset (list 'localds:bogus')) (lambda (list e) (call (attr e 'Jets') 'AntiKt4EMTopoJets'))) (lambda (list j) (/ (call (attr j 'pt')) 1000.0))) (list 'JetPt') 'analysis' 'junk.root')" # NOQA - if dest == 'rootfiles': - r = ds.get_data_rootfiles(request) - print(r) - elif dest == 'rootfiles-minio': - r = ds.get_data_rootfiles_async(request) - async for f in r: # type: ignore - print(f) - - -if __name__ == '__main__': - # Setup the arguments we can deal with here. - parser = argparse.ArgumentParser(description='test servicex frontend.') - parser.add_argument('--log', dest='logging', action='store_const', - const=True, default=False, - help='Name of endpoint to use from servicex.yaml file') - parser.add_argument('--endpoint', dest='endpoint', - default='atlas') - parser.add_argument('--output', dest='output', - default=['rootfiles'], nargs=1, - choices=['rootfiles', 'rootfiles-minio'], - help='What output format should be returned') - args = parser.parse_args() - - if args.logging: - import logging - ch = logging.StreamHandler() - ch.setLevel(logging.DEBUG) - logging.getLogger('servicex').setLevel(logging.DEBUG) - logging.getLogger('servicex').addHandler(ch) - - # servicex_adaptor = ServiceXAdaptor(sys.argv[1]) if len(sys.argv) >= 2 else None - loop = asyncio.get_event_loop() - try: - loop.run_until_complete(run_query(args.endpoint, args.output[0])) - finally: - loop.close() diff --git a/scripts/test_jupyter_environment.ipynb b/scripts/test_jupyter_environment.ipynb deleted file mode 100644 index b14e5954..00000000 --- a/scripts/test_jupyter_environment.ipynb +++ /dev/null @@ -1,168 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test ServiceX FE in Jupyter\n", - "The Jupyter environment does some funny things when using async as compared to the command line. This notebook does a very simple dummy query to make sure the basics are all working. I would call this an \"integrated\" test." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import asyncio\n", - "import json\n", - "import shutil\n", - "from unittest import mock\n", - "\n", - "import pandas as pd\n", - "import pytest\n", - "\n", - "import ServiceX_fe as fe" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Build a set of mocks to deal with the underlying internals and prevent us from having to out to the outside world" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_minio_file(mocker, fname):\n", - " r = mocker.MagicMock()\n", - " r.object_name = fname\n", - " return r\n", - "\n", - "class ClientSessionMocker:\n", - " def __init__(self, text, status):\n", - " self._text = text\n", - " self.status = status\n", - "\n", - " async def text(self):\n", - " return self._text\n", - "\n", - " async def json(self):\n", - " return json.loads(self._text)\n", - "\n", - " async def __aexit__(self, exc_type, exc, tb):\n", - " pass\n", - "\n", - " async def __aenter__(self):\n", - " return self\n", - " \n", - "class fget_object_good_copy_callable(mock.MagicMock):\n", - " def __call__(self, *args, **kwargs):\n", - " assert len(args) == 3\n", - "\n", - " shutil.copy('tests\\\\sample_servicex_output.root',\n", - " args[2])\n", - "\n", - "def files_back_1(mocker):\n", - " mocker.patch('minio.api.Minio.list_objects', return_value=[make_minio_file(mocker, 'root:::dcache-atlas-xrootd-wan.desy.de:1094::pnfs:desy.de:atlas:dq2:atlaslocalgroupdisk:rucio:mc15_13TeV:8a:f1:DAOD_STDM3.05630052._000001.pool.root.198fbd841d0a28cb0d9dfa6340c890273-1.part.minio')])\n", - " mocker.patch('minio.api.Minio.fget_object', new_callable=fget_object_good_copy_callable)\n", - "\n", - "def good_transform_request(mocker):\n", - " '''\n", - " Setup to run a good transform request that returns a single file.\n", - " '''\n", - " r1 = ClientSessionMocker(json.dumps({\"request_id\": \"1234-4433-111-34-22-444\"}), 200)\n", - " mocker.patch('aiohttp.ClientSession.post', return_value=r1)\n", - " r2 = ClientSessionMocker(json.dumps({\"files-remaining\": \"0\", \"files-processed\": \"1\"}), 200)\n", - " mocker.patch('aiohttp.ClientSession.get', return_value=r2)\n", - "\n", - "def time_is_short(mocker):\n", - " class AsyncMock(mock.MagicMock):\n", - " async def __call__(self, *args, **kwargs):\n", - " return super(AsyncMock, self).__call__(*args, **kwargs)\n", - "\n", - " mocker.patch('asyncio.sleep', new_callable=AsyncMock)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Getting a simple dataset with no async stuff.\n", - "\n", - "Setup the mocks" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "files_back_1(mock)\n", - "time_is_short(mock)\n", - "good_transform_request(mock)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the test" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "ename": "RuntimeError", - "evalue": "This event loop is already running", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mRuntimeError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m#def test_good_run_single_ds_1file_noasync_with_loop(good_transform_request, time_is_short, files_back_1):\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfe\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'(valid qastle string)'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'one_ds'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;32massert\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32massert\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mr\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m283458\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mi:\\gwatts\\code\\irishep\\servicex_frontend\\ServiceX_fe\\servicex.py\u001b[0m in \u001b[0;36mget_data\u001b[1;34m(selection_query, datasets, servicex_endpoint)\u001b[0m\n\u001b[0;32m 179\u001b[0m '''\n\u001b[0;32m 180\u001b[0m \u001b[0mloop\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0masyncio\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_event_loop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 181\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mloop\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_until_complete\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mget_data_async\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mselection_query\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mservicex_endpoint\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python37\\lib\\asyncio\\base_events.py\u001b[0m in \u001b[0;36mrun_until_complete\u001b[1;34m(self, future)\u001b[0m\n\u001b[0;32m 568\u001b[0m \u001b[0mfuture\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_done_callback\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_run_until_complete_cb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 569\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 570\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_forever\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 571\u001b[0m \u001b[1;32mexcept\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 572\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mnew_task\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mfuture\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdone\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mand\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mfuture\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcancelled\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python37\\lib\\asyncio\\base_events.py\u001b[0m in \u001b[0;36mrun_forever\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 523\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_check_closed\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 524\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 525\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'This event loop is already running'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 526\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mevents\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_running_loop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 527\u001b[0m raise RuntimeError(\n", - "\u001b[1;31mRuntimeError\u001b[0m: This event loop is already running" - ] - } - ], - "source": [ - "#def test_good_run_single_ds_1file_noasync_with_loop(good_transform_request, time_is_short, files_back_1):\n", - "\n", - "r = fe.get_data('(valid qastle string)', 'one_ds')\n", - "assert isinstance(r, pd.DataFrame)\n", - "assert len(r) == 283458" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/servicex/ConfigSettings.py b/servicex/ConfigSettings.py deleted file mode 100644 index 5cbd1723..00000000 --- a/servicex/ConfigSettings.py +++ /dev/null @@ -1,55 +0,0 @@ -from confuse import Configuration, yaml_util, ConfigSource -from pathlib import Path - - -class ConfigSettings(Configuration): - def __init__(self, appname, modname=None, loader=yaml_util.Loader): - Configuration.__init__(self, appname, modname, loader) - - def read(self, user=True, defaults=True): - """ - Read in the settings from various locations. - """ - if user: - self._add_local_source() - self._add_home_source() - self._add_user_source() - if defaults: - self._add_default_source() - - def _add_local_source(self): - """ - Look for a '.xxx" file in the local directory - """ - self._add_from_path(Path(f"{self.appname}.yaml"), walk_up_tree=True) - self._add_from_path(Path(f"{self.appname}.yml"), walk_up_tree=True) - self._add_from_path(Path(f".{self.appname}"), walk_up_tree=True) - - # def _add_from_path(self, p: Path): - # if p.exists(): - # yaml_data = yaml_util.load_yaml(p, loader=self.loader) or {} - # self.add(ConfigSource(yaml_data, str(p.resolve()))) - - def _add_from_path(self, p: Path, walk_up_tree: bool = False): - p.resolve() - name = p.name - dir = p.parent.resolve() - while True: - f = dir / name - if f.exists(): - yaml_data = yaml_util.load_yaml(f, loader=self.loader) or {} # type: ignore - self.add(ConfigSource(yaml_data, str(f))) - break - if not walk_up_tree: - break - if dir == dir.parent: - break - dir = dir.parent - - def _add_home_source(self): - """ - Look for a '.xxx" file in the local directory - """ - self._add_from_path(Path.home() / f"{self.appname}.yaml") - self._add_from_path(Path.home() / f"{self.appname}.yml") - self._add_from_path(Path.home() / f".{self.appname}") diff --git a/servicex/__init__.py b/servicex/__init__.py deleted file mode 100644 index fc21c490..00000000 --- a/servicex/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .servicex import ServiceXDataset, StreamInfoUrl, StreamInfoPath # NOQA -from .utils import ( # NOQA - ServiceXException, - ServiceXUnknownRequestID, - ServiceXFailedFileTransform, - ServiceXFatalTransformException, - StatusUpdateCallback, - StatusUpdateFactory, - ServiceXUnknownDataRequestID, - clean_linq, - DatasetType, -) -from .servicex_adaptor import ServiceXAdaptor # NOQA -from .minio_adaptor import MinioAdaptor # NOQA -from .cache import Cache, ignore_cache, update_local_query_cache # NOQA diff --git a/servicex/cache.py b/servicex/cache.py deleted file mode 100644 index 7d5f764d..00000000 --- a/servicex/cache.py +++ /dev/null @@ -1,515 +0,0 @@ -import hashlib -import json -import logging -import os -from contextlib import contextmanager -from pathlib import Path -from typing import Any, Dict, List, Optional, Set, Tuple - -from .utils import ServiceXException, _query_cache_hash, sanitize_filename - -_ignore_cache = False - - -@contextmanager -def ignore_cache(): - """This will cause all caches to be ignored while it is invoked: - - ``` - with ignore_cache(): - ServiceXDataset(...).get_data...() - ``` - - If you want to do this globally, you can just use the `__enter__()` method. - This is probably the only way to do this accross cells in a notebook. - - ``` - i = ignore_cache() - i.__enter__() - ... Query code, jupyter notebook cells, etc. go here - i.__exit(None, None, None) - ``` - - Note: - - - The only time the cache is checked is when the query is actually made, not when - the servicex dataset object is created! - - Calls to this can be safely nested. - - Note that calling this doesn't clear the cache or delete anything. It - just prevents the cache lookup from working while it is in effect. - """ - global _ignore_cache - old_value = _ignore_cache - _ignore_cache = True - yield - _ignore_cache = old_value - - -# Track where we should write out an analysis cache (and search up-stream). -# This contains the directory of the file. -_g_analysis_cache_location: Optional[Path] = None -_g_analysis_cache_filename: str = "servicex_query_cache.json" - -# List of queries we know to be bad from this run -_g_bad_query_cache_ids: Set[str] = set() - - -def reset_local_query_cache(): - """Used to reset the analysis cache location. Normally called only - during testing. - """ - global _g_analysis_cache_location - _g_analysis_cache_location = None - global _g_analysis_cache_filename - _g_analysis_cache_filename = "servicex_query_cache.json" - global _g_bad_query_cache_ids - _g_bad_query_cache_ids = set() - - -reset_local_query_cache() - - -def update_local_query_cache(analysis_cache: Optional[Path] = None): - """Record analysis query hashes in an analysis cache. - - If this routine is not called, the current directory is searched for an - analysis cache file. If found, it participates in the query lookup. - - After this routine is called, then when a query is made or looked up, an - analysis cache file in the local directory is updated with new query request - id's. - - This will allow one user to send a file to another user, along with the - servicex backend in `servicex.yaml` allow them to fetch the same data. - (or share on a similar machine). - - Args: - analysis_cache (Optional[Path], optional): The directory or filename of - the analysis cache file. If `None` defaults to the file `servicex_query_cache.json` in - the local directory. If only a directory is passed, then the `servicex_query_cache.json` - in that directory is used. Defaults to None. - """ - file_path = ( - Path(".") - if analysis_cache is None - else analysis_cache - if analysis_cache.is_dir() - else analysis_cache.parent - ) - - name = ( - "servicex_query_cache.json" - if (analysis_cache is None or analysis_cache.is_dir()) - else analysis_cache.name - ) - - global _g_analysis_cache_filename - global _g_analysis_cache_location - if _g_analysis_cache_location is not None and _g_analysis_cache_filename != name: - raise ServiceXException( - "Updating local query cache called twice, with " - f"{_g_analysis_cache_filename} and {name}." - ) - _g_analysis_cache_filename = name - - if ( - _g_analysis_cache_location is not None - and _g_analysis_cache_location != file_path - ): - raise ServiceXException( - "Updating local query cache called twice, with " - f"{_g_analysis_cache_location} and {file_path}." - ) - _g_analysis_cache_location = file_path - - loc = _g_analysis_cache_location / _g_analysis_cache_filename - if not loc.exists(): - loc.parent.mkdir(parents=True, exist_ok=True) - loc.touch() - - -class Cache: - """ - Caching for all data returns from the system. It provides both in-memory - and on-disk cache. - - TODO: Rename this to be an adaptor, unifying how we name things - """ - - _in_memory_cache = {} - - @classmethod - def reset_cache(cls): # # pragma: no cover - "Reset the internal cache, usually used for testing" - cls._in_memory_cache = {} - - def __init__( - self, - cache_path: Path, - ignore_cache: bool = False, - analysis_query_key: str = "default", - ): - """ - Create the cache object - - Arguments: - - cache_path The path to the cache directory. Only sub-directories - will be created in this path. - ignore_cache If true, then always ignore the cache for any queries - against this dataset. - """ - self._path = cache_path - self._ignore_cache = ignore_cache - self._analysis_query_key = analysis_query_key - - # old windows versions have a limit of file path of 260 chars. - self.max_path_len = 200 - if os.name == "nt": - self.max_path_len = self.max_path_len - 100 - - @property - def path(self) -> Path: - "Return root path of cache directory" - return self._path - - @contextmanager - def ignore_cache(self): - """Ignore the cache as long as we are held. Supports nesting.""" - old_ignore = self._ignore_cache - self._ignore_cache = True - yield - self._ignore_cache = old_ignore - - def _query_cache_file(self, json: Dict[str, str]) -> Path: - "Return the query cache file" - h = _query_cache_hash(json) - return self._path / "query_cache" / h - - def _query_status_cache_file(self, request_id: str) -> Path: - "Return the query cache file" - return self._path / "query_cache_status" / request_id - - def _files_cache_file(self, id: str) -> Path: - "Return the file that contains the list of files" - return self._path / "file_list_cache" / id - - def lookup_query(self, json: Dict[str, str]) -> Optional[str]: - global _ignore_cache - if _ignore_cache or self._ignore_cache: - return None - - f = self._query_cache_file(json) - if not f.exists(): - hash = _query_cache_hash(json) - if hash in _g_bad_query_cache_ids: - return None - return self._lookup_analysis_query_cache(hash) - - with f.open("r") as i: - request_id = i.readline().strip() - logging.getLogger(__name__).debug(f"Found query '{request_id}' in cache") - - self._write_analysis_query_cache(json, request_id) - - return request_id - - def set_query(self, json: Dict[str, str], v: str): - """Associate a query with a request-id. - - A hash is taken of the query. - - Args: - json (Dict[str, str]): The query JSON - v (str): The `request-id` - """ - f = self._query_cache_file(json) - f.parent.mkdir(parents=True, exist_ok=True) - with f.open("w") as o: - o.write(f"{v}\n") - - self._write_analysis_query_cache(json, v) - - def remove_query(self, json: Dict[str, Any]): - """Remove the query from our local and analysis caches - - Args: - json (Dict[str, Any]): The query to remove - """ - f = self._query_cache_file(json) - if f.exists(): - f.unlink() - self._remove_from_analysis_cache(_query_cache_hash(json)) - - def _load_full_analysis_query_cache(self) -> Optional[Dict[str, Dict[str, str]]]: - """Safely load the analysis query cache, with all elements of the cache - - - If there is no cache file, return None - - If the file is empty, return an empty cache - - Return the contents of the file. - - Returns: - Optional[Dict[str, str]]: Returns the query cache if it exists - """ - q_file = self._get_analysis_cache_file() - if not q_file.exists(): - return None - - analysis_cache = {} - with q_file.open("r") as input: - text = input.read() - if len(text) > 0: - analysis_cache: Dict[str, Dict[str, str]] = json.loads(text) - - return analysis_cache - - def _load_analysis_query_cache(self) -> Optional[Dict[str, str]]: - """Safely load the analysis query cache. - - - If there is no cache file, return None - - If the file is empty, return an empty cache - - Return the contents of the file. - - Returns: - Optional[Dict[str, str]]: Returns the query cache if it exists - """ - full_analysis_cache = self._load_full_analysis_query_cache() - if full_analysis_cache is None: - return None - - # Find "our" analysis cache - analysis_cache = {} - if self._analysis_query_key in full_analysis_cache: - analysis_cache = full_analysis_cache[self._analysis_query_key] - - return analysis_cache - - def _save_analysis_query_cache(self, cache: Dict[str, str]): - full_cache = self._load_full_analysis_query_cache() - assert ( - full_cache is not None - ), "Internal error, should have been checked already" - - full_cache[self._analysis_query_key] = cache - - cache_file = self._get_analysis_cache_file() - with cache_file.open("w") as output: - json.dump(full_cache, output) - - def _write_analysis_query_cache(self, query_info: Dict[str, str], request_id: str): - """Write out a local analysis query hash-request-id assocaition. - - Args: - query_info (Dict[str, str]): The JSON of the request - request_id (str): The `request-id` - """ - analysis_cache = self._load_analysis_query_cache() - if analysis_cache is None: - return - - analysis_cache[_query_cache_hash(query_info)] = request_id - - self._save_analysis_query_cache(analysis_cache) - - def _remove_from_analysis_cache(self, query_hash: str): - """Remove an item from the analysis cache if we are writing to it! - - Args: - query_hash (str): The hash we will remove - """ - if _g_analysis_cache_location is None: - _g_bad_query_cache_ids.add(query_hash) - return - - cache_contents = self._find_analysis_cached_query(query_hash) - if cache_contents is not None: - del cache_contents[query_hash] - self._save_analysis_query_cache(cache_contents) - - def _lookup_analysis_query_cache( - self, - query_hash: str, - filename: Optional[str] = None, - location: Optional[Path] = None, - ) -> Optional[str]: - """Look at all possible query caches for this query. - - If `location` is `None`, then start from the global location searching for a query file. - If `location` is specified, check that directory. - In both cases, if the query hash isn't found, then move up one directory and try again. - - `filename` is the name of the file we should be looking for. If `None` default to the - global. - - Args: - query_hash (str): The hash of the query we need to lookup. - filename (Optional[str]): The name fo the file that contains the cache. If not - specified then defaults to the global. - location (Optional[Path]): Directory to start searching in. If not specified then - defaults to the global. If that isn't specified, defaults to the current directory. - - Returns: - (Optional[str]): The return hash of what we need to look up - """ - cache_contents = self._find_analysis_cached_query(query_hash) - if cache_contents is not None: - return cache_contents[query_hash] - return None - - def _get_analysis_cache_file( - self, filename: Optional[str] = None, location: Optional[Path] = None - ) -> Path: - """Get our best guess as to where the analysis cache file will be - - It will use the globally set defaults if nothing is specified. - - Args: - filename (Optional[str], optional): Cache filename to use. Defaults to None. - location (Optional[str], optional): Cache location to use. Defaults to None. - """ - c_filename = filename if filename is not None else _g_analysis_cache_filename - c_location = ( - location - if location is not None - else _g_analysis_cache_location - if _g_analysis_cache_location is not None - else Path(".") - ) - - # Now see if we can find it - loc = c_location.absolute() / c_filename - while (not loc.exists()) and (len(loc.parts) >= 3): - new_parent = loc.parent.parent - loc = new_parent / c_filename - - return loc - - def _find_analysis_cached_query( - self, - query_hash: str, - filename: Optional[str] = None, - location: Optional[Path] = None, - ) -> Optional[Dict[str, str]]: - """Returns the contents of an analysis cache file and the file that contains - a query hash - - Args: - has (str): The hash of the query we are to find - - Returns: - Tuple[Dict[str, str], Path]: The contents of the file and the path to the - analysis cache that contains the hash. `None` if the query was not found - """ - # If the cache is here, then see if it has a hit - analysis_cache = self._load_analysis_query_cache() - if analysis_cache is not None: - if query_hash in analysis_cache: - return analysis_cache - - return None - - def set_query_status(self, query_info: Dict[str, str]): - """Cache a query status (json dict) - - Args: - query_info (Dict[str, str]): The info we should cache. Must contain `request_id`. - """ - assert ( - "request_id" in query_info - ), "Internal error - request_id should always be part of info returned" - f = self._query_status_cache_file(query_info["request_id"]) - f.parent.mkdir(parents=True, exist_ok=True) - with f.open("w") as o: - json.dump(query_info, o) - - def lookup_query_status(self, request_id: str) -> Dict[str, str]: - """Returns the info from the last time the query status was cached. - - Args: - request_id (str): Request id we should look up. - - """ - f = self._query_status_cache_file(request_id) - if not f.exists(): - raise ServiceXException(f"No cache information for query {request_id}") - with f.open("r") as o: - return json.load(o) - - def query_status_exists(self, request_id: str) -> bool: - """Returns true if the query status file exists on the local machine. - - Args: - request_id (str): The request-id to look up - - Returns: - bool: True if present, false otherwise. - """ - return self._query_status_cache_file(request_id).exists() - - def set_files(self, id: str, files: List[Tuple[str, Path]]): - """Cache the files for this request - - Note: We do check to make sure all the files exist - - Args: - id (str): The request-id - files (List[Tuple[str, Path]]): the minio buck name and local file paths - """ - # Make sure they exist - assert all(f.exists() for _, f in files) - f = self._files_cache_file(id) - f.parent.mkdir(parents=True, exist_ok=True) - with f.open("w") as o: - json.dump([(n, str(f)) for n, f in files], o) - - def lookup_files(self, id: str) -> Optional[List[Tuple[str, Path]]]: - """Return a list of files in the cache for a request id. - - - Returns None if there is nothing in the cache - - Returns None if any of the files are missing - - Args: - id (str): Request-id we are looking up - - Returns: - Optional[List[Tuple[str, Path]]]: List of minio-bucket to local file mappings - """ - f = self._files_cache_file(id) - if not f.exists(): - return None - with f.open("r") as i: - list_of_cached_files = [(n, Path(p)) for n, p in json.load(i)] - if all(f.exists() for _, f in list_of_cached_files): - return list_of_cached_files - return None - - def set_inmem(self, id: str, v: Any): - self._in_memory_cache[id] = v - - def lookup_inmem(self, id: str) -> Optional[Any]: - global _ignore_cache - if _ignore_cache or self._ignore_cache: - return None - - if id not in self._in_memory_cache: - return None - return self._in_memory_cache[id] - - def data_file_location(self, request_id: str, data_name: str) -> Path: - """ - Return the path to the file that should be written out for this - data_name. This is where the output file should get stored. - Truncate the leftmost characters from filenames to avoid throwing a - OSError: [Errno 63] File name too long error. Use a hash string to - make sure that the file names remain unique. - """ - parent = self._path / "data" / request_id - parent.mkdir(parents=True, exist_ok=True) - sanitized = sanitize_filename(data_name) - if (len(sanitized) + len(parent.name)) > self.max_path_len: - hash = hashlib.md5(sanitized.encode()) - hash_string = hash.hexdigest() - max_len = self.max_path_len - len(parent.name) - len(hash_string) - 1 - sanitized = f"{hash_string}-{sanitized[len(sanitized)-max_len:]}" - - return parent / sanitized diff --git a/servicex/config_default.yaml b/servicex/config_default.yaml deleted file mode 100644 index e5bfa587..00000000 --- a/servicex/config_default.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# Default settings for servicex. This will point you to a developer end-point, that -# you've setup on your own machine (usually using k8's port-forward command): - -api_endpoints: - - endpoint: http://localhost:5000 - name: default - type: xaod - # token: xxx - - endpoint: http://localhost:5000 - name: default - type: cms_run1_aod - - endpoint: http://localhost:5000 - name: default - type: uproot - -# This is the path of the cache. The "/tmp" will be translated, platform appropriate, and -# the env variable USER will be replaced. -cache_path: /tmp/servicex_${USER} - -# This is a dummy value, here only to make sure that unit testing -# works properly before package release. -testing_value: 10 - -# If we can't figure out what backend the user is going to use, we -# return this sort of file. Parquet for the uproot backend, and root for the -# xaod backend. -default_return_data: parquet - -# Defaults for the various types of servicex backends that we might deal with. -# Easy enough to add a new one here... -backend_types: - - type: xaod - return_data: root-file - codegen: atlasxaod - - type: uproot - return_data: parquet - codegen: uproot - - type: cms_run1_aod - return_data: root-file - codegen: cms - - type: python - return_data: parquet - codegen: python diff --git a/servicex/data_conversions.py b/servicex/data_conversions.py deleted file mode 100644 index 9f200eb7..00000000 --- a/servicex/data_conversions.py +++ /dev/null @@ -1,185 +0,0 @@ -import asyncio -from concurrent.futures import ThreadPoolExecutor -from pathlib import Path -from typing import Iterable, Optional - -import pandas as pd -import awkward as ak - -from .utils import ServiceXException - -_conversion_pool = ThreadPoolExecutor(4) - - -class DataConverterAdaptor: - """Methods to convert from one type of data to the other.""" - - def __init__(self, default_file_type: str): - """Create a data converter adaptor. By default it will do the - conversation as requested. - - Args: - default_file_type (str): The default file type (`parquet` or `root`) - """ - self._default_file_type = default_file_type - - async def convert_to_pandas(self, file: Path, file_type: Optional[str] = None): - """Convert to a pandas DataFrame from data stored in a file of a particular file_type - - Args: - file (Path): Path to the file - file_type (str): What the file contains (root, parquet, etc) - """ - file_type = file_type if file_type is not None else self._default_file_type - if file_type == "root-file": - return await self._convert_root_to_pandas(file) - elif file_type == "parquet": - return await self._convert_parquet_to_pandas(file) - else: - raise ServiceXException( - f"Conversion from {file_type} into an pandas DF is not " "yet supported" - ) - - async def convert_to_awkward(self, file: Path, file_type: Optional[str] = None): - """Convert to an awkward data array from data stored in a file of a particular file_type - - Args: - file (Path): Path to the file - file_type (str): What the file contains (root, parquet, etc) - """ - file_type = file_type if file_type is not None else self._default_file_type - if file_type == "root-file": - return await self._convert_root_to_awkward(file) - elif file_type == "parquet": - return await self._convert_parquet_to_awkward(file) - else: - raise ServiceXException( - f"Conversion from {file_type} into an awkward array is not " - "yet supported" - ) - - def combine_pandas(self, dfs: Iterable[pd.DataFrame]) -> pd.DataFrame: - """Combine many pandas DataFrame into a single one, in order. - - Args: - dfs (Iterable[pd.DataFrame]): The list of DataFrames - """ - return pd.concat(dfs) - - def combine_awkward(self, awks: Iterable[ak.Array]) -> ak.Array: - """Combine many awkward arrays into a single one, in order. - - Args: - awks (Iterable[ChunkedArray]): The input list of awkward arrays - """ - return ak.concatenate(awks) # type: ignore - - async def _convert_root_to_pandas(self, file: Path): - """ - Convert the contents of a ROOT file to pandas. - - Arguments: - - file A `Path` to the file containing the pandas data - - Returns: - - DataFrame A pandas DataFrame - - Note: - - - Work is done on a second thread. - - Pandas is only imported if this is called. - - """ - from pandas import DataFrame - - def do_the_work(file: Path) -> DataFrame: - import uproot as uproot - - with uproot.open(file) as f_in: - r = f_in[f_in.keys()[0]] - return r.arrays(library="pd") # type: ignore - - return await asyncio.wrap_future(_conversion_pool.submit(do_the_work, file)) - - async def _convert_parquet_to_pandas(self, file: Path): - """ - Convert the contents of a parquet file to pandas. - - Arguments: - - file A `Path` to the file containing the pandas data - - Returns: - - DataFrame A pandas DataFrame - - Note: - - - Work is done on a second thread. - - Pandas is only imported if this is called. - - """ - import pandas as pd - - def do_the_work(file: Path) -> pd.DataFrame: - return pd.read_parquet(str(file)) - - return await asyncio.wrap_future(_conversion_pool.submit(do_the_work, file)) - - async def _convert_root_to_awkward(self, file: Path): - """ - Convert the contents of a ROOT file to an awkward dictionary. - - Arguments: - - file A `Path` to the file containing the pandas data - - Returns: - - DataFrame A pandas DataFrame - - Note: - - - Work is done on a second thread. - - Awkward is only imported if this is called. - - A LazyArray is returned, so it isn't completely loaded into memory. That also means - this will leak file handles - as that has to be left open. - - """ - - def do_the_work(file: Path) -> ak.Array: - import uproot as uproot - - with uproot.open(file) as f_in: - tree_name = f_in.keys()[0] - - return uproot.lazy(f"{file}:{tree_name}") - - return await asyncio.wrap_future(_conversion_pool.submit(do_the_work, file)) - - async def _convert_parquet_to_awkward(self, file: Path): - """ - Convert the contents of a parquet file to an awkward dictionary. - - Arguments: - - file A `Path` to the file containing the pandas data - - Returns: - - DataFrame A pandas DataFrame - - Note: - - - Work is done on a second thread. - - Pandas is only imported if this is called. - - """ - - def do_the_work(file: Path) -> ak.Array: - # TODO: When we move to awkward1, make sure this becomes lazy - return ak.from_parquet(str(file)) # type: ignore - - return await asyncio.wrap_future(_conversion_pool.submit(do_the_work, file)) diff --git a/servicex/minio_adaptor.py b/servicex/minio_adaptor.py deleted file mode 100644 index 19fb9b90..00000000 --- a/servicex/minio_adaptor.py +++ /dev/null @@ -1,232 +0,0 @@ -# Copyright (c) 2019-2020, IRIS-HEP -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import asyncio -import urllib.parse -from concurrent.futures.thread import ThreadPoolExecutor -from pathlib import Path -from typing import Any, AsyncIterator, List, Optional, Dict, cast -import logging - -import backoff -from backoff import on_exception -from minio import Minio, ResponseError -from minio.error import NoSuchBucket -from urllib3.exceptions import MaxRetryError - -from .utils import ServiceXException, ServiceXNoFilesInCache - - -class MinioAdaptor: - # Threadpool on which downloads occur. This is because the current minio library - # uses blocking http requests, so we can't use asyncio to interleave them. - _download_executor = ThreadPoolExecutor(max_workers=5) - - def __init__( - self, - minio_endpoint: str, - secured: bool = False, - access_key: str = "miniouser", - secretkey: str = "leftfoot1", - ): - self._endpoint = minio_endpoint - self._secured = secured - self._access_key = access_key - self._secretkey = secretkey - - self._client = Minio( - self._endpoint, - access_key=self._access_key, - secret_key=self._secretkey, - secure=self._secured, - ) - - @on_exception(backoff.constant, ResponseError, interval=0.1) - def get_files(self, request_id) -> List[str]: - try: - return [str(f.object_name) for f in self._client.list_objects(request_id)] - except MaxRetryError as e: - msg = ( - f"Unable to reach Minio at {e.pool.host}:{e.pool.port}{e.url}. " - f"Max retries exceeded." - ) - raise ServiceXException(msg) - except NoSuchBucket as e: - raise ServiceXNoFilesInCache( - f'No files in cache for request "{request_id}"' - ) from e - - def get_access_url(self, request_id: str, object_name: str) -> str: - """Given a request ID and the file name in that request id, return a URL - that can be directly accessed to download the file. - - Args: - request_id (str): The request id guid (that is the bucket in minio) - object_name (str): The file (the object in the minio bucket) - - Returns: - str: A url good for some amount of time to access the bucket. - """ - return self._client.presigned_get_object(request_id, object_name) - - def get_s3_uri(self, request_id: str, object_name: str) -> str: - """Given a request ID and a file name in that request, return an S3 URI that can - be used by a correctly configured S3 client. - - Args: - :param request_id: The request id guid (that is the bucket in minio) - :param object_name: The file (the object in the minio bucket) - :return: - A formatted S3 URI to that object - """ - return urllib.parse.urlunsplit(("s3", request_id, object_name, None, None)) - - async def download_file( - self, request_id: str, bucket_fname: str, output_file: Path - ) -> None: - """ - Download a single file to a local temp file. - - Arguments: - minio_client Open and authenticated minio client - request_id The id of the request we are going after - bucket_fname The fname of the bucket - output_file Filename where we should write this file. - - Notes: - - Download to a temp file that is renamed at the end so that a partially - downloaded file is not mistaken as a full one - - Run with async, despite minio not being async. - """ - # Make sure the output directory exists - output_file.parent.mkdir(parents=True, exist_ok=True) - - # We are going to build a temp file, and download it from there. - def do_copy() -> None: - temp_file = output_file.parent / f"{output_file.name}.temp" - try: - log = logging.getLogger(__name__) - log.debug( - f"Starting download of minio file for request {request_id}, " - f"file {bucket_fname}." - ) - self._client.fget_object(request_id, bucket_fname, str(temp_file)) - log.debug( - f"Finished download of minio file for request {request_id}, " - f"file {bucket_fname}." - ) - temp_file.rename(output_file) - except Exception as e: - raise ServiceXException( - f"Failed to copy minio bucket {bucket_fname} from request " - f"{request_id} to {output_file}" - ) from e - - # If the file exists, we don't need to do anything. - if output_file.exists(): - return - - # Do the copy, which might take a while, on a separate thread. - return await asyncio.wrap_future(self._download_executor.submit(do_copy)) - - -class MinioAdaptorFactory: - """A factor that will return, when asked, the proper minio adaptor to use for a request - to get files from ServiceX. - """ - - def __init__(self, always_return: Optional[MinioAdaptor] = None): - """Create the factor with a possible adaptor to always use - - Args: - always_return (Optional[MinioAdaptor], optional): The adaptor to always use. If none, - then one will be created by the best other available method. Defaults to None. - """ - # Get the defaults setup. - self._always = always_return - self._config_adaptor = None - - def from_best( - self, transaction_info: Optional[Dict[str, str]] = None - ) -> MinioAdaptor: - """Using the information we have, create the proper Minio Adaptor with the correct - endpoint and login information. Order of adaptor generation: - - 1. The `always_return` option from the ctor - 1. Use info from the `translation_info` - 1. Use the info from the config handed in to the ctor - - Raises: - Exception: If we do not have enough information to create an adaptor, this is raised. - - Returns: - MinioAdaptor: The adaptor that can be used to extract the data from minio for this - request. - """ - if self._always is not None: - logging.getLogger(__name__).debug("Using the pre-defined minio_adaptor") - return self._always - if transaction_info is not None: - keys = [ - "minio-endpoint", - "minio-secured", - "minio-access-key", - "minio-secret-key", - ] - if all(k in transaction_info for k in keys): - logging.getLogger(__name__).debug( - "Using the request-specific minio_adaptor" - ) - return MinioAdaptor( - transaction_info["minio-endpoint"], - bool(transaction_info["minio-secured"]), - transaction_info["minio-access-key"], - transaction_info["minio-secret-key"], - ) - raise ServiceXException( - "Do not know or have enough information to create a Minio " - f"Login info ({transaction_info})" - ) - - -async def find_new_bucket_files( - adaptor: MinioAdaptor, request_id: str, update: AsyncIterator[Any] -) -> AsyncIterator[str]: - """ - Each time we get something from the async iterator, check to see if - there are any files present. - """ - seen = [] - async for _ in update: - # Sadly, this is blocking, and so may hold things up - files = cast(List[str], adaptor.get_files(request_id)) - - # If there are new files, pass them on - for f in files: - if f not in seen: - seen.append(f) - yield f diff --git a/servicex/servicex.py b/servicex/servicex.py deleted file mode 100644 index 65c2288e..00000000 --- a/servicex/servicex.py +++ /dev/null @@ -1,1120 +0,0 @@ -import asyncio -import functools -import logging -import time -from datetime import timedelta -from pathlib import Path -from typing import ( - Any, - AsyncGenerator, - AsyncIterator, - Awaitable, - Callable, - Dict, - Iterable, - List, - Optional, - Tuple, - Union, -) - -import aiohttp -import backoff -import minio -from backoff import on_exception -from make_it_sync import make_sync - -from servicex.servicex_config import ServiceXConfigAdaptor - -from .cache import Cache -from .data_conversions import DataConverterAdaptor -from .minio_adaptor import MinioAdaptor, MinioAdaptorFactory, find_new_bucket_files -from .servicex_adaptor import ( - ServiceXAdaptor, - transform_status_stream, - trap_servicex_failures, -) -from .servicex_utils import _wrap_in_memory_sx_cache -from .servicexabc import ServiceXABC -from .utils import ( - DatasetType, - ServiceXException, - ServiceXFailedFileTransform, - ServiceXFatalTransformException, - ServiceXNoFilesInCache, - ServiceXUnknownDataRequestID, - ServiceXUnknownRequestID, - StatusUpdateFactory, - _run_default_wrapper, - _status_update_wrapper, - default_client_session, - get_configured_cache_path, - log_adaptor, - on_exception_itr, - stream_status_updates, - stream_unique_updates_only, -) - -# The allowed file formats. -# You could modify this if you wanted to add new... -g_allowed_formats = ["parquet", "root-file"] - - -class StreamInfoBase: - """Contains base information about results that are streamed back from - ServiceX. - """ - - def __init__(self, file: str): - self._file = file - - @property - def file(self) -> str: - """Returns the ServiceX filename - - This filename is unique in the dataset, and will be the same across different queries - against the dataset. It can be used as a key to sort results. - - Notes: - - - May contains non-file system characters - - Returns: - str: servicex filename - """ - return self._file - - -class StreamInfoUrl(StreamInfoBase): - """Contains information about results that are streamed back from ServiceX. - Used when a URL to access the data directly from ServiceX is requested. - """ - - def __init__(self, file: str, url: str, bucket: str): - super().__init__(file) - self._url = url - self._bucket = bucket - - @property - def url(self) -> str: - """URL that can can be used to stream data back from ServiceX. - - Returns: - str: The URL of the transformed data for this file. - """ - return self._url - - @property - def bucket(self) -> str: - """Returns the buck name - unique and constant across transformations. - Can be used to order the results - - Returns: - str: The bucket name as produced by ServiceX - """ - return self._bucket - - -class StreamInfoPath(StreamInfoBase): - """Contains information about results that are streamed back from ServiceX. - Used when the user has requested streaming, but copying the file locally first. - """ - - def __init__(self, file: str, path: Path): - super().__init__(file) - self._path = path - - @property - def path(self) -> Path: - """Path the the local file of ServiceX data that represents this query. - - Returns: - Path: The path object that points to the data requested. - """ - return self._path - - @property - def url(self) -> str: - """URI to the locally downloaded file. - - Returns: - str: The URI of the transformed data for this file. - """ - return self._path.as_uri() - - -class StreamInfoData(StreamInfoBase): - """Contains information about results that are streamed back from ServiceX. - Used when data (`pandas` or `awkward`) is requested. The data is downloaded from - ServiceX, converted into the requested format, and then streamed to the user in these - chunks. There is a single chunk per file. - """ - - def __init__(self, file: str, data: Any): - super().__init__(file) - self._data = data - - @property - def data(self) -> Any: - """The `pandas.DataFrame` or `awkward` array return - - Returns: - Any: The ServiceX transformed data for this file. - """ - return self._data - - -class ServiceXDataset(ServiceXABC): - """ - Used to access an instance of ServiceX at an end point on the internet. Support conversion - by configuration object `config_adaptor` or by creating the adaptors defined in the `__init__` - function. - """ - - def __init__( - self, - dataset: DatasetType, - backend_name: Optional[str] = None, - backend_type: Optional[str] = None, - codegen: Optional[str] = None, - image: Optional[str] = None, - max_workers: int = 20, - result_destination: str = "object-store", - servicex_adaptor: Optional[ServiceXAdaptor] = None, - minio_adaptor: Optional[Union[MinioAdaptor, MinioAdaptorFactory]] = None, - cache_adaptor: Optional[Cache] = None, - status_callback_factory: Optional[StatusUpdateFactory] = _run_default_wrapper, - local_log: Optional[log_adaptor] = None, - session_generator: Optional[ - Callable[[], Awaitable[aiohttp.ClientSession]] - ] = None, - config_adaptor: Optional[ServiceXConfigAdaptor] = None, - data_convert_adaptor: Optional[DataConverterAdaptor] = None, - ignore_cache: bool = False, - ): - """ - Create and configure a ServiceX object for a dataset. - - Arguments - - dataset Name of a dataset from which queries will be selected. - backend_name The type of backend. Used only if we need to find an - end-point. If we do not have a `servicex_adaptor` then this - will default to xaod, unless you have any endpoint listed - in your servicex file. It will default to best match there, - or fail if a name has been given. - backend_type The type of backend. Overrides the `type` in the `yaml` - config file. - codegen The type of code generator passed to the backend to - generate the code that powers the requested transform. - Don't use unless you know what you are doing - sometimes - the return filetype is also needed. Better to use - `backend_type`! - image Name of transformer image to use to transform the data. If - left as default, `None`, then the default image for the - ServiceX backend will be used. - max_workers Maximum number of transformers to run simultaneously on - ServiceX. - result_destination Where the transformers should write the results. - Defaults to object-store, but could be used to save - results to a posix volume - servicex_adaptor Object to control communication with the servicex instance - at a particular ip address with certain login credentials. - Will be configured via the `config_adaptor` by default. - minio_adaptor Object to control communication with the minio servicex - instance. - cache_adaptor Runs the caching for data and queries that are sent up and - down. - status_callback_factory Factory to create a status notification callback for each - query. One is created per query. - local_log Log adaptor for logging. - session_generator If you want to control the `ClientSession` object that - is used for callbacks. Otherwise a single one for all - `servicex` queries is used. - config_adaptor Control how configuration options are read from the - a configuration file (e.g. servicex.yaml). - data_convert_adaptor Manages conversions between root and parquet and `pandas` - and `awkward`, including default settings for expected - datatypes from the backend. - ignore_cache Always ignore the cache on any query for this dataset. This - is only meaningful if no cache adaptor is provided. - Defaults to false - the cache is used if possible. - - Notes: - - - The `status_callback` argument, by default, uses the `tqdm` library to render - progress bars in a terminal window or a graphic in a Jupyter notebook (with proper - jupyter extensions installed). If `status_callback` is specified as None, no - updates will be rendered. A custom callback function can also be specified which - takes `(total_files, transformed, downloaded, skipped)` as an argument. The - `total_files` parameter may be `None` until the system knows how many files need to - be processed (and some files can even be completed before that is known). - - The full description of calling parameters is recorded in the local cache, including - things like `image` name and tag. - """ - ServiceXABC.__init__( - self, - dataset, - codegen, - image, - max_workers, - result_destination, - status_callback_factory, - ) - - # Get the local settings - config = ( - config_adaptor if config_adaptor is not None else ServiceXConfigAdaptor() - ) - - # Establish the cache that will store all our queries - self._cache = ( - Cache( - get_configured_cache_path(config.settings), - ignore_cache, - analysis_query_key=backend_name - if backend_name is not None - else "default", - ) - if cache_adaptor is None - else cache_adaptor - ) - - if not servicex_adaptor: - # Given servicex adaptor is none, this should be ok. Fixes type checkers - end_point, token = config.get_servicex_adaptor_config( - backend_name, backend_type=backend_type - ) - servicex_adaptor = ServiceXAdaptor(end_point, token) - self._servicex_adaptor = servicex_adaptor - - if not minio_adaptor: - self._minio_adaptor = MinioAdaptorFactory() - else: - if isinstance(minio_adaptor, MinioAdaptor): - self._minio_adaptor = MinioAdaptorFactory(always_return=minio_adaptor) - else: - self._minio_adaptor = minio_adaptor - - self._log = log_adaptor() if local_log is None else local_log - - self._session_generator = ( - session_generator - if session_generator is not None - else default_client_session - ) - - self._return_types = [ - config.get_default_returned_datatype( - backend_name, backend_type=backend_type - ) - ] - self._converter = ( - data_convert_adaptor - if data_convert_adaptor is not None - else DataConverterAdaptor(self._return_types[0]) - ) - - # TODO - this should not be in the ABC backend since we have to have some intelligence - # in setting it, it turns out. - if self._codegen is None: - self._codegen = config.get_backend_info( - backend_name, "codegen", backend_type=backend_type - ) - - def first_supported_datatype( - self, datatypes: Union[List[str], str] - ) -> Optional[str]: - """Return the first datatype format that this dataset/servicex instance can return. - - Different instances of `ServiceX` are capable of returning different datatypes. Pass in - the datatypes that your app supports, and this will return the first one that the servicex - backend can return. - - Args: - datatypes (Union[List[str], str]): A single or list of datatypes that are supported by - your app. - - Returns: - str: The first datatype that is supported. If none of them are, then `None` is - returned. - """ - datatypes = [datatypes] if isinstance(datatypes, str) else datatypes - for dt in datatypes: - if dt in self._return_types: - return dt - - return None - - def ignore_cache(self): - """Return a context manager that, as long as it is held, will cause any queries against - just this dataset to ignore any locally cached data. - - Returns: - ContextManager: As long as this is held, the local query cache will be ignored. - """ - return self._cache.ignore_cache() - - @functools.wraps(ServiceXABC.get_data_rootfiles_async, updated=()) - @_wrap_in_memory_sx_cache - async def get_data_rootfiles_async( - self, selection_query: str, title: Optional[str] = None - ) -> List[Path]: - return await self._file_return(selection_query, "root-file", title) - - async def get_data_rootfiles_stream( - self, selection_query: str, title: Optional[str] = None - ) -> AsyncIterator[StreamInfoPath]: - """Returns, as an async iterator, each completed batch of work from Servicex. - The `StreamInfoPath` contains a path where downstream consumers can directly - access the data. - - Args: - selection_query (str): The `qastle` query for the data to retrieve. - - Yields: - AsyncIterator[StreamInfoPath]: As ServiceX completes the data, and it is downloaded - to the local machine, the async iterator returns - a `StreamInfoPath` which can be used to access the - file locally. - """ - async for f_info in self._stream_local_files( - selection_query, title, "root-file" - ): # type: ignore - yield f_info - - @functools.wraps(ServiceXABC.get_data_parquet_async, updated=()) - @_wrap_in_memory_sx_cache - async def get_data_parquet_async( - self, selection_query: str, title: Optional[str] = None - ) -> List[Path]: - return await self._file_return(selection_query, "parquet", title) - - async def get_data_parquet_stream( - self, selection_query: str, title: Optional[str] = None - ) -> AsyncIterator[StreamInfoPath]: - """Returns, as an async iterator, each completed batch of work from Servicex. - The `StreamInfoPath` contains a path where downstream consumers can directly - access the data. - - Args: - selection_query (str): The `qastle` query for the data to retrieve. - - Yields: - AsyncIterator[StreamInfoPath]: As ServiceX completes the data, and it is downloaded - to the local machine, the async iterator returns - a `StreamInfoPath` which can be used to access the - file locally. - """ - async for f_info in self._stream_local_files( - selection_query, title, "parquet" - ): # type: ignore - yield f_info - - @functools.wraps(ServiceXABC.get_data_pandas_df_async, updated=()) - @_wrap_in_memory_sx_cache - async def get_data_pandas_df_async( - self, selection_query: str, title: Optional[str] = None - ): - data_format = self._return_types[0] - return self._converter.combine_pandas( - await self._data_return( - selection_query, - lambda f: self._converter.convert_to_pandas(f), - title, - data_format=data_format, - ) - ) - - @functools.wraps(ServiceXABC.get_data_awkward_async, updated=()) - @_wrap_in_memory_sx_cache - async def get_data_awkward_async( - self, selection_query: str, title: Optional[str] = None - ): - data_format = self._return_types[0] - return self._converter.combine_awkward( - await self._data_return( - selection_query, - lambda f: self._converter.convert_to_awkward(f), - title, - data_format=data_format, - ) - ) - - async def get_data_awkward_stream( - self, selection_query: str, title: Optional[str] = None - ) -> AsyncGenerator[StreamInfoData, None]: - """Returns, as an async iterator, each completed batch of work from Servicex - as a separate `awkward` array. The data is returned in a `StreamInfoData` object. - - Args: - selection_query (str): The `qastle` query for the data to retrieve. - - Yields: - AsyncIterator[StreamInfoData]: As ServiceX completes the data, and it is downloaded - to the local machine, the async iterator returns - a `StreamInfoData` which can be used to access the - data that has been loaded from the file. - """ - async for a in self._stream_return( - selection_query, title, lambda f: self._converter.convert_to_awkward(f) - ): - yield a - - async def get_data_pandas_stream( - self, selection_query: str, title: Optional[str] = None - ) -> AsyncGenerator[StreamInfoData, None]: - """Returns, as an async iterator, each completed batch of work from Servicex - as a separate `pandas.DataFrame` array. The data is returned in a `StreamInfoData` object. - - Args: - selection_query (str): The `qastle` query for the data to retrieve. - - Yields: - AsyncIterator[StreamInfoData]: As ServiceX completes the data, and it is downloaded - to the local machine, the async iterator returns - a `StreamInfoData` which can be used to access the - data that has been loaded from the file. - """ - async for a in self._stream_return( - selection_query, title, lambda f: self._converter.convert_to_pandas(f) - ): - yield a - - async def get_data_rootfiles_uri_stream( - self, - selection_query: str, - title: Optional[str] = None, - as_signed_url: Optional[bool] = False, - ) -> AsyncIterator[StreamInfoUrl]: - """Returns, as an async iterator, each completed batch of work from ServiceX. - The data that comes back includes a `url` that can be accessed to download the - data. - - Args: - selection_query (str): The ServiceX Selection - title (str): Optional title for transform request - as_signed_url (bool): Return the uri as a presigned http url? - """ - async for f_info in self._stream_url_buckets( - selection_query, "root-file", title, as_signed_url - ): # type: ignore - yield f_info - - async def get_data_rootfiles_uri_async( - self, - selection_query: str, - title: Optional[str] = None, - as_signed_url: Optional[bool] = False, - ) -> List[StreamInfoUrl]: - """Returns a list of StreamInfoUrl entries containing a `url` for each output file - from the transform, taken from get_data_rootfiles_uri_stream. - The data that comes back includes a `url` that can be accessed to download the - data. - - Args: - selection_query (str): The ServiceX Selection - title (str): Optional title for transform request - as_signed_url (bool): Return the uri as a presigned http url? - """ - return [ - f - async for f in self.get_data_rootfiles_uri_stream( - selection_query, title=title, as_signed_url=as_signed_url - ) - ] - - async def get_data_parquet_uri_stream( - self, - selection_query: str, - title: Optional[str] = None, - as_signed_url: Optional[bool] = False, - ) -> AsyncIterator[StreamInfoUrl]: - """Returns, as an async iterator, each of the files from the minio bucket, - as the files are added there. - - Args: - selection_query (str): The ServiceX Selection - title (str): Optional title for transform request - as_signed_url (bool): Return the uri as a presigned http url? - """ - async for f_info in self._stream_url_buckets( - selection_query, "parquet", title, as_signed_url - ): # type: ignore - yield f_info - - async def get_data_parquet_uri_async( - self, - selection_query: str, - title: Optional[str] = None, - as_signed_url: Optional[bool] = False, - ) -> List[StreamInfoUrl]: - """Returns a list of each of the files from the minio bucket. - - Args: - selection_query (str): The ServiceX Selection - title (str): Optional title for transform request - as_signed_url (bool): Return the uri as a presigned http url? - """ - return [ - f_info - async for f_info in self.get_data_parquet_uri_stream( - selection_query, title, as_signed_url - ) - ] - - async def _file_return( - self, selection_query: str, data_format: str, title: Optional[str] - ): - """ - Given a query, return the list of files, in a unique order, that hold - the data for the query. - - For certain types of exceptions, the queries will be repeated. For example, - if `ServiceX` indicates that it was restarted in the middle of the query, then - the query will be re-submitted. - - Arguments: - - selection_query `qastle` data that makes up the selection request. - data_format The file-based data format (root or parquet) - title The title assigned to this transform request. - - Returns: - - data Data converted to the "proper" format, depending - on the converter call. - """ - - async def convert_to_file(f: Path) -> Path: - return f - - return await self._data_return( - selection_query, convert_to_file, title, data_format - ) - - @on_exception_itr( - backoff.constant, ServiceXUnknownRequestID, interval=0.1, max_tries=3 - ) - @on_exception_itr( - backoff.constant, - (ServiceXUnknownDataRequestID, minio.error.NoSuchBucket), - interval=0.1, - max_tries=2, - ) - async def _stream_url_buckets( - self, - selection_query: str, - data_format: str, - title: Optional[str], - as_signed_url: Optional[bool], - ) -> AsyncGenerator[StreamInfoUrl, None]: - """Get a list of files back for a request - - Args: - selection_query (str): The selection query we are to do - data_format (str): The requested file format - title (Optional[str]): The title of transform to pass to ServiceX - as_signed_url (Optional[bool]): Return the uri as a presigned http url? - - Yields: - AsyncIterator[Dict[str, str]]: A tuple of the minio bucket and file in that bucket. - The dict will have entries for: - bucket: The minio bucket name - file: the completed file in the bucket - """ - query = self._build_json_query(selection_query, data_format, title) - - async with aiohttp.ClientSession() as client: - # Get a request id - which might be cached, but if not, submit it. - request_id = await self._get_request_id(client, query) - - # Make sure cache status exists (user could have deleted, see #176) - if not self._cache.query_status_exists(request_id): - await self._update_query_status(client, request_id) - - # Get the minio adaptor we are going to use for downloading. - minio_adaptor = self._minio_adaptor.from_best( - self._cache.lookup_query_status(request_id) - ) - - # Look up the cache, and then fetch an iterator going through the results - # from either servicex or the cache, depending. - try: - notifier = self._create_notifier(title, False) - minio_files = self._get_minio_bucket_files_from_servicex( - request_id, client, minio_adaptor, notifier - ) - - # Reflect the files back up a level. - async for object_name in minio_files: - uri = ( - minio_adaptor.get_access_url(request_id, object_name) - if as_signed_url - else minio_adaptor.get_s3_uri(request_id, object_name) - ) - - yield StreamInfoUrl(object_name, uri, request_id) - - # Cache the final status - await self._update_query_status(client, request_id) - - except ServiceXUnknownRequestID as e: - self._cache.remove_query(query) - raise ServiceXUnknownDataRequestID( - "Expected the ServiceX backend to know about " - f"query {request_id}. It did not. Cleared local" - "cache. Please resubmit to trigger a new " - "query." - ) from e - - except ServiceXFatalTransformException as e: - transform_status = await self._servicex_adaptor.get_query_status( - client, request_id - ) - self._cache.remove_query(query) - raise ServiceXFatalTransformException( - f'ServiceX Fatal Error: {transform_status["failure-info"]}' - ) from e - - except ServiceXFailedFileTransform as e: - self._cache.remove_query(query) - await self._servicex_adaptor.dump_query_errors(client, request_id) - raise ServiceXException( - f"Failed to transform all files in {request_id}" - ) from e - - @on_exception(backoff.constant, ServiceXUnknownRequestID, interval=0.1, max_tries=3) - @on_exception( - backoff.constant, - (ServiceXUnknownDataRequestID, minio.error.NoSuchBucket), - interval=0.1, - max_tries=2, - ) - async def _data_return( - self, - selection_query: str, - converter: Callable[[Path], Awaitable[Any]], - title: Optional[str], - data_format: str = "root-file", - ) -> List[Any]: - """Given a query, return the data, in a unique order, that hold - the data for the query. - - For certain types of exceptions, the queries will be repeated. For example, - if `ServiceX` indicates that it was restarted in the middle of the query, then - the query will be re-submitted. - - Arguments: - - selection_query `qastle` data that makes up the selection request. - converter A `Callable` that will convert the data returned from - `ServiceX` as a set of files. - title Title to send to the backend service - data_format The data format that we want to render in - - Returns: - - data Data converted to the "proper" format, depending - on the converter call. - """ - all_data = { - f.file: f.data - async for f in self._stream_return( - selection_query, title, converter, data_format - ) - } - - # Finally, we need them in the proper order so we append them - # all together - ordered_data = [all_data[k] for k in sorted(all_data.keys())] - - return ordered_data - - async def _stream_return( - self, - selection_query: str, - title: Optional[str], - converter: Callable[[Path], Awaitable[Any]], - data_format: str = "root-file", - ) -> AsyncIterator[StreamInfoData]: - """Given a query, return the data, in the order it arrives back - converted as appropriate. - - For certain types of exceptions, the queries will be repeated. For example, - if `ServiceX` indicates that it was restarted in the middle of the query, then - the query will be re-submitted. - - Arguments: - - selection_query `qastle` data that makes up the selection request. - converter A `Callable` that will convert the data returned from - `ServiceX` as a set of files. - - Returns: - - data Data converted to the "proper" format, depending - on the converter call. - """ - as_data = ( - StreamInfoData(f.file, await asyncio.ensure_future(converter(f.path))) - async for f in self._stream_local_files(selection_query, title, data_format) - ) # type: ignore - - async for r in as_data: - yield r - - async def _stream_local_files( - self, selection_query: str, title: Optional[str], data_format: str = "root-file" - ) -> AsyncGenerator[StreamInfoPath, None]: - """ - Given a query, return the data as a list of paths pointing to local files - that contain the results of the query. This is an async generator, and files - are returned as they arrive. - - For certain types of exceptions, the queries will be repeated. For example, - if `ServiceX` indicates that it was restarted in the middle of the query, then - the query will be re-submitted. - - Arguments: - - selection_query `qastle` data that makes up the selection request. - - Returns: - - data Data converted to the "proper" format, depending - on the converter call. - """ - # Get a notifier to update anyone who wants to listen. - notifier = self._create_notifier(title, True) - - # Get all the files - as_files = ( - f - async for f in self._get_files( - selection_query, data_format, notifier, title - ) - ) # type: ignore - - async for name, a_path in as_files: - yield StreamInfoPath(name, Path(await a_path)) - - async def _get_files( - self, - selection_query: str, - data_format: str, - notifier: _status_update_wrapper, - title: Optional[str], - ) -> AsyncIterator[Tuple[str, Awaitable[Path]]]: - """ - Return a list of files from servicex as they have been downloaded to this machine. The - return type is an awaitable that will yield the path to the file. - - For certain types of `ServiceX` failures we will automatically attempt a few retries: - - - When `ServiceX` forgets the query. This sometimes happens when a user submits a - query, and then disconnects from the network, `ServiceX` is restarted, and then the - user attempts to download the files from that "no-longer-existing" request. - - Up to 3 re-tries are attempted automatically. - - Arguments: - - selection_query The query string to send to ServiceX - data_format The type of data that we want to come back. - notifier Status callback to let our progress be advertised - title Title to pass to servicex backend. - - Returns - Awaitable[Path] An awaitable that is a path. When it completes, the - path will be valid and point to an existing file. - This is returned this way so a number of downloads can run - simultaneously. - """ - query = self._build_json_query(selection_query, data_format, title) - - async with aiohttp.ClientSession() as client: - # Get a request id - which might be cached, but if not, submit it. - request_id = await self._get_request_id(client, query) - - # Make sure cache status exists (user could have deleted, see #176) - if not self._cache.query_status_exists(request_id): - await self._update_query_status(client, request_id) - - # Get the minio adaptor we are going to use for downloading. - minio_adaptor = self._minio_adaptor.from_best( - self._cache.lookup_query_status(request_id) - ) - - # Look up the cache, and then fetch an iterator going through the results - # from either servicex or the cache, depending. - try: - cached_files = self._cache.lookup_files(request_id) - stream_local_files = ( - self._get_cached_files(cached_files, notifier) - if cached_files is not None - else self._get_files_from_servicex( - request_id, client, minio_adaptor, notifier - ) - ) - - # Reflect the files back up a level. - async for r in stream_local_files: - yield r - - # Cache the final status - if cached_files is None: - await self._update_query_status(client, request_id) - - except ServiceXUnknownRequestID as e: - self._cache.remove_query(query) - raise ServiceXUnknownDataRequestID( - "Expected the ServiceX backend to know about " - f"query {request_id}. It did not. Cleared local" - " cache. Please resubmit to trigger a new " - "query." - ) from e - except ServiceXNoFilesInCache as e: - self._cache.remove_query(query) - raise ServiceXUnknownDataRequestID( - "Expected the ServiceX backend to have cached data " - f"from query {request_id}. It did not. Cleared local" - " cache. Please resubmit to trigger a new " - "query." - ) from e - - except ServiceXFatalTransformException as e: - transform_status = await self._servicex_adaptor.get_query_status( - client, request_id - ) - self._cache.remove_query(query) - raise ServiceXFatalTransformException( - f'ServiceX Fatal Error: {transform_status["failure-info"]}' - ) from e - - except ServiceXFailedFileTransform as e: - self._cache.remove_query(query) - await self._servicex_adaptor.dump_query_errors(client, request_id) - raise ServiceXException( - f"Failed to transform all files in {request_id}" - ) from e - - async def _get_request_id( - self, client: aiohttp.ClientSession, query: Dict[str, Any] - ) -> str: - """ - For this query, fetch the request id. If we have it cached, use that. Otherwise, query - ServiceX for a enw one (and cache it for later use). - """ - request_id = self._cache.lookup_query(query) - if request_id is None: - request_info = await self._servicex_adaptor.submit_query(client, query) - request_id = request_info["request_id"] - self._cache.set_query(query, request_id) - await self._update_query_status(client, request_id) - return request_id - - async def _update_query_status( - self, client: aiohttp.ClientSession, request_id: str - ): - """Fetch the status from servicex and cache it locally, over - writing what was there before. - - Args: - request_id (str): Request id of the status to fetch and cache. - """ - info = await self._servicex_adaptor.get_query_status(client, request_id) - self._cache.set_query_status(info) - - async def _get_cached_files( - self, cached_files: List[Tuple[str, Path]], notifier: _status_update_wrapper - ): - """ - Return the list of files as an iterator that we have pulled from the cache - """ - notifier.update(processed=len(cached_files), remaining=0, failed=0) - loop = asyncio.get_event_loop() - for f, p in cached_files: - path_future = loop.create_future() - path_future.set_result(p) - notifier.inc(downloaded=1) - yield f, path_future - - async def _download_a_file( - self, - stream: AsyncIterator[str], - request_id: str, - minio_adaptor: MinioAdaptor, - notifier: _status_update_wrapper, - ) -> AsyncIterator[Tuple[str, Awaitable[Path]]]: - """ - Given an object name and request id, fetch the data locally from the minio bucket. - The copy can take a while, so send it off to another thread - don't pause queuing up other - files to download. - """ - - async def do_copy(final_path): - assert request_id is not None - await minio_adaptor.download_file(request_id, f, final_path) - notifier.inc(downloaded=1) - notifier.broadcast() - return final_path - - file_object_list: List[Tuple[str, Path]] = [] - async for f in stream: - copy_to_path = self._cache.data_file_location(request_id, f) - file_object_list.append((f, copy_to_path)) - - yield f, do_copy(copy_to_path) - - self._cache.set_files(request_id, file_object_list) - - async def _get_files_from_servicex( - self, - request_id: str, - client: aiohttp.ClientSession, - minio_adaptor: MinioAdaptor, - notifier: _status_update_wrapper, - ): - """ - Fetch query result files from `servicex`. Given the `request_id` we will download - files as they become available. We also coordinate caching. - """ - start_time = time.monotonic() - good = True - try: - # Get the stream of minio bucket new files. - stream_new_object = self._get_minio_bucket_files_from_servicex( - request_id, client, minio_adaptor, notifier - ) - - # Next, download the files as they are found (and return them): - stream_downloaded = self._download_a_file( - stream_new_object, request_id, minio_adaptor, notifier - ) - - # Return the files to anyone that wants them! - - async for info in stream_downloaded: - yield info - - except Exception: - good = False - raise - - finally: - end_time = time.monotonic() - run_time = timedelta(seconds=end_time - start_time) - logging.getLogger(__name__).info( - f"Running servicex query for " f"{request_id} took {run_time}" - ) - self._log.write_query_log( - request_id, - notifier.total, - notifier.failed, - run_time, - good, - self._cache.path, - ) - - async def _get_minio_bucket_files_from_servicex( - self, - request_id: str, - client: aiohttp.ClientSession, - minio_adaptor: MinioAdaptor, - notifier: _status_update_wrapper, - ) -> AsyncIterator[str]: - """Create an async stream of `minio` bucket/filenames from a request id. - - Args: - request_id (str): The request id that we should be polling for updates. - client (aiohttp.ClientSession): The client connection to make API queries on - minio_adaptor (MinioAdaptor): The minio adaptor we can use to connect to the minio - bucket for new items. - notifier (_status_update_wrapper): Allows us to send updates of progress - back to the user - - Yields: - [type]: Returns xxx and yyy. - """ - start_time = time.monotonic() - try: - # Setup the status sequence from servicex - stream_status = transform_status_stream( - self._servicex_adaptor, client, request_id - ) - stream_notified = stream_status_updates(stream_status, notifier) - stream_watched = trap_servicex_failures(stream_notified) - stream_unique = stream_unique_updates_only(stream_watched) - - # Next, download the files as they are found (and return them): - stream_new_object = find_new_bucket_files( - minio_adaptor, request_id, stream_unique - ) - - # Return the minio information. - async for info in stream_new_object: - yield info - - finally: - end_time = time.monotonic() - run_time = timedelta(seconds=end_time - start_time) - logging.getLogger(__name__).info( - f"Running servicex query for " - f"{request_id} took {run_time} (no files downloaded)" - ) - - def _build_json_query( - self, selection_query: str, data_format: str, title: Optional[str] - ) -> Dict[str, Union[str, Iterable[str]]]: - """ - Returns a list of locally written files for a given selection query. - - Arguments: - selection_query The query to be send into the ServiceX API - data_format What is the output data type (parquet, root-file, etc.) - - Notes: - - Internal routine. - """ - assert data_format in g_allowed_formats - - # Items that must always be present - codegen = self._codegen if self._codegen is not None else "default" - - json_query: Dict[str, Union[str, Iterable[str]]] = { - "selection": selection_query, - "result-destination": self._result_destination, - "result-format": data_format, - "chunk-size": "1000", - "workers": str(self._max_workers), - "codegen": codegen, - } - - # Add the appropriate did. - # Capture full did as well as single item files (see #178) - if isinstance(self._dataset, str): - if self._dataset[0:7].lower() in ["root://", "http://"]: - json_query["file-list"] = [self._dataset] - else: - json_query["did"] = self._dataset - else: - json_query["file-list"] = self._dataset - - # Optional items - if self._image is not None: - json_query["image"] = self._image - - if title is not None: - json_query["title"] = title - - logging.getLogger(__name__).debug( - f"JSON to be sent to servicex: {str(json_query)}" - ) - - return json_query - - # Define the synchronous versions of the async methods for easy of use - - get_data_rootfiles_uri = make_sync(get_data_rootfiles_uri_async) - get_data_parquet_uri = make_sync(get_data_parquet_uri_async) diff --git a/servicex/servicex_adaptor.py b/servicex/servicex_adaptor.py deleted file mode 100644 index 2565e978..00000000 --- a/servicex/servicex_adaptor.py +++ /dev/null @@ -1,276 +0,0 @@ -import asyncio -from datetime import datetime -from typing import AsyncIterator, Dict, Optional, Tuple -import logging - -import aiohttp -from google.auth import jwt - -from .utils import ( - ServiceXException, - ServiceXFailedFileTransform, - ServiceXFatalTransformException, - ServiceXUnknownRequestID, - TransformTuple, -) - -# Number of seconds to wait between polling servicex for the status of a transform job -# while waiting for it to finish. -servicex_status_poll_time = 5.0 - - -# Low level routines for interacting with a ServiceX instance via the WebAPI -class ServiceXAdaptor: - def __init__(self, endpoint, refresh_token=None): - """ - Authenticated access to ServiceX - """ - self._endpoint = endpoint - self._token = None - self._refresh_token = refresh_token - - async def _get_token(self, client: aiohttp.ClientSession): - url = f"{self._endpoint}/token/refresh" - headers = {"Authorization": f"Bearer {self._refresh_token}"} - async with client.post(url, headers=headers, json=None) as response: - status = response.status - if status == 200: - j = await response.json() - self._token = j["access_token"] - else: - raise ServiceXException( - f"ServiceX access token request rejected: {status}" - ) - - async def _get_authorization(self, client: aiohttp.ClientSession): - if not self._refresh_token: - return {} - now = datetime.utcnow().timestamp() - if not self._token or jwt.decode(self._token, verify=False)["exp"] - now < 0: - await self._get_token(client) - return {"Authorization": f"Bearer {self._token}"} - - async def submit_query( - self, client: aiohttp.ClientSession, json_query: Dict[str, str] - ) -> Dict[str, str]: - """ - Submit a query to ServiceX, and return a request ID - """ - - headers = await self._get_authorization(client) - - async with client.post( - f"{self._endpoint}/servicex/transformation", - headers=headers, - json=json_query, - ) as response: - status = response.status - if status != 200: - # This was an error at ServiceX, bubble it up so code above us can - # handle as needed. - t = await response.text() - raise ServiceXException( - "ServiceX rejected the transformation request: " f"({status}){t}" - ) - - r = await response.json() - return r - - async def get_query_status( - self, client: aiohttp.ClientSession, request_id: str - ) -> Dict[str, str]: - """Returns the full query information from the endpoint. - - Args: - client (aiohttp.ClientSession): Client session on which to make the request. - request_id (str): The request id to return the tranform status - - Raises: - ServiceXException: If we fail to find the information. - - Returns: - Dict[str, str]: The JSON dictionary of information returned from ServiceX - """ - headers = await self._get_authorization(client) - - async with client.get( - f"{self._endpoint}/servicex/transformation/{request_id}", headers=headers - ) as response: - status = response.status - if status != 200: - # This was an error at ServiceX, bubble it up so code above us can - # handle as needed. - t = await response.text() - raise ServiceXException( - "ServiceX rejected the transformation status fetch: " - f"({status}){t}" - ) - - r = await response.json() - return r - - async def dump_query_errors(self, client: aiohttp.ClientSession, request_id: str): - """Dumps to the logging system any error messages we find from ServiceX. - - Args: - client (aiohttp.ClientSession): Client along which to send queries. - request_id (str): Fetch all errors from there. - """ - - headers = await self._get_authorization(client) - async with client.get( - f"{self._endpoint}/servicex/transformation/{request_id}/errors", - headers=headers, - ) as response: - status = response.status - if status != 200: - t = await response.text() - if "Request not found" in t: - raise ServiceXUnknownRequestID( - f"Unable to get errors for request {request_id}" - f": {status} - {t}" - ) - else: - raise ServiceXException( - f"Failed to get request errors for {request_id}: " - f"{status} - {t}" - ) - - # Dump the messages out to the logger if there are any! - # Keep the output under control - only dump the first 20 errors (see #188) - errors = (await response.json())["errors"] - log = logging.getLogger(__name__) - log.warning(f"Transform {request_id} had {len(errors)} errors:") - for e in errors[:20]: - log.warning(f' Error transforming file: {e["file"]}') - for ln in e["info"].split("\n"): - log.warning(f" -> {ln}") - - @staticmethod - def _get_transform_stat(info: Dict[str, str], stat_name: str) -> Optional[int]: - "Return the info from a servicex status reply, protecting against bad internet returns" - return ( - None - if ((stat_name not in info) or (info[stat_name] is None)) - else int(info[stat_name]) - ) - - async def get_transform_status( - self, client: aiohttp.ClientSession, request_id: str - ) -> Tuple[Optional[int], int, Optional[int]]: - """ - Internal routine that queries for the current stat of things. We expect the - following things to come back: - - files-processed - - files-remaining - - files-skipped - - request-id - - stats - - If the transform has already completed, we return data from cache. - - Arguments: - - endpoint Web API address where servicex lives - request_id The id of the request to check up on - - Raises: - - ServiceXException If the status returns `Fatal`. - - Returns: - - files_remaining How many files remain to be processed. None if the number - has not yet been determined - files_processed How many files have been successfully processed - by the system. - files_failed Number of files that were skipped - """ - headers = await self._get_authorization(client) - - # Make the actual query - async with client.get( - f"{self._endpoint}/servicex/transformation/{request_id}/status", - headers=headers, - ) as response: - status = response.status - if status != 200: - raise ServiceXUnknownRequestID( - f"Unable to get transform status " - f"for request id {request_id}" - f" - http error {status}" - ) - info = await response.json() - logging.getLogger(__name__).debug( - f"Status response for {request_id}: {info}" - ) - - if "status" in info and info["status"] == "Fatal": - raise ServiceXFatalTransformException( - f"Transform status for {request_id}" ' is marked "Fatal".' - ) - - files_remaining = self._get_transform_stat(info, "files-remaining") - files_failed = self._get_transform_stat(info, "files-skipped") - files_processed = self._get_transform_stat(info, "files-processed") - - if files_remaining is not None and int(files_remaining) < 0: - raise ServiceXFatalTransformException( - f"Transform {request_id} returned negative files remaining. Bug in ServiceX?" - ) - - assert files_processed is not None - - return files_remaining, files_processed, files_failed - - -async def transform_status_stream( - sa: ServiceXAdaptor, client: aiohttp.ClientSession, request_id: str -) -> AsyncIterator[TransformTuple]: - """ - Returns an async stream of `(files-remaining, files_processed, files_failed)` until the - servicex `request_id` request is finished, against the servicex instance located at - `sa`. - - Arguments: - - sa The servicex low level adaptor - client An async http function we can call and use - request_id The request id for this request - - Returns: - - remaining, processed, skipped Returns an async stream triple of the - status numbers. Every time we find something - we send it on. - - Note: - """ - done = False - while not done: - next_processed = await sa.get_transform_status(client, request_id) - remaining, _, _ = next_processed - done = remaining is not None and remaining == 0 - yield next_processed - - if not done: - await asyncio.sleep(servicex_status_poll_time) - - -async def trap_servicex_failures( - stream: AsyncIterator[TransformTuple], -) -> AsyncIterator[TransformTuple]: - """ - Looks for any failed files. If it catches one, it will remember it and throw once the stream - is done. This allows all the files to come down first. - """ - async for p in stream: - remain, processed, did_fail = p - if did_fail is not None and did_fail != 0: - raise ServiceXFailedFileTransform( - f"ServiceX failed to transform {did_fail} " - f"files - data incomplete (remaining: {remain}, " - f"processed: {processed})." - ) - - yield p diff --git a/servicex/servicex_config.py b/servicex/servicex_config.py deleted file mode 100644 index b195d8b1..00000000 --- a/servicex/servicex_config.py +++ /dev/null @@ -1,221 +0,0 @@ -import logging -from typing import Dict, Optional, Tuple - -from confuse.core import ConfigView - -from servicex.ConfigSettings import ConfigSettings -from .utils import ServiceXException - - -class ServiceXConfigAdaptor: - """Contains the logic to extract all the configuration information needed, as driven from - things the user has given us and program parameters. This concentrates all the complex config - logic in on place, and, hopefully, leaves the logic out of all the other code. - """ - - def __init__(self, config: Optional[ConfigView] = None): - """The config needed for the app. - - Note: The config is held onto and only queried when the information is required. - - Args: - config (ConfigView): The config information for the app. If null, then we just use the - standard servicex name. - """ - self._settings = ( - config if config is not None else ConfigSettings("servicex", "servicex") - ) - - @property - def settings(self) -> ConfigView: - """Return the config settings. - - Eventually this should not be used other than for testing! - - Returns: - ConfigSettings: The config settings that gives us a view on everything the user wants - """ - return self._settings - - def get_default_returned_datatype( - self, backend_name: Optional[str], backend_type: Optional[str] = None - ) -> str: - """Return the default return data type, given the backend is a certain type. - - Args: - backend_name (Optional[str]): The backend type string (`xaod`, `uproot`, etc) - - Returns: - str: The backend datatype, like `root` or `parquet`. - """ - # Check to see if we know about the backend info - r = self.get_backend_info( - backend_name, "return_data", backend_type=backend_type - ) - - if r is None: - raise ServiceXException( - "A default default_return_data is missing from config files " - "- is servicex installed correctly?" - ) - - return r - - def get_backend_info( - self, backend_name: Optional[str], key: str, backend_type: Optional[str] = None - ) -> Optional[str]: - """Find an item in the backend info, searching first for the backend - name/type and then the defaults with a given type. - - Args: - backend_name (str): Backend name - key (str): The key for the info we are after - backend_type (str): The backend type, if we are overriding normal lookup - - Returns: - Optional[str]: Return a string for the info we are after, or return None if we can't - find it. - """ - config = self._get_backend_info(backend_name, backend_type) - return config[key] if key in config else None - - def _get_backend_info( - self, backend_name: Optional[str], backend_type: Optional[str] - ) -> Dict[str, str]: - """Returns all the info for a backend name/type. - - Search algorithm is non-trivial: - 1. If `backend_name` is not `None`: - 1. Look at the `api_endpoints` for a `name` matching `backend_name`. - 2. Look at the `api_endpoints` for a `type` matching `backend_name`, - complain that `name` wasn't present. - 3. Fail if nothing matches - 2. If `backend_name` is None: - 1. Use the first end point in the list, and complain. - - Given the above is done, then look at `backend_types` for a matching `type`, - and for any key found there not already present, add it, and return the dictionary. - - Args: - backend_name (str): Name or type of the api end point we are going to look up. - backend_type (str): Override the backend type, if we are looking for a specific - type behavior. - - Returns: - Dict[str, str]: Attributes for this backend's configuration - """ - # Find a list of all endpoints. - # It is an error if this is not specified somewhere. - endpoints = self.settings["api_endpoints"] - - # If we have a good name, look for exact match - config: Optional[Dict[str, str]] = None - log = logging.getLogger(__name__) - if backend_name is not None: - # Search the list of end points for a matching name - for ep in endpoints: - if ep["name"].exists() and ep["name"].as_str_expanded() == backend_name: - config = {k: str(ep[k].as_str_expanded()) for k in ep.keys()} - break - if config is None: - for ep in endpoints: - if ( - ep["type"].exists() - and ep["type"].as_str_expanded() == backend_name - ): - config = {k: str(ep[k].as_str_expanded()) for k in ep.keys()} - log.warning( - f'Found backend type matching "{backend_name}". Matching by ' - 'type is deprecated. Please switch to using the "name" ' - "keyword in your servicex.yaml file." - ) - break - if config is None: - # They asked for something explicit, we couldn't find it, so we need to bomb. - # Given how annoying this is, build a useful error message. - seen_types = [ - str(ep["type"].as_str_expanded()) - for ep in endpoints - if ep["type"].exists() - ] - seen_names = [ - str(ep["name"].as_str_expanded()) - for ep in endpoints - if ep["name"].exists() - ] - - raise ServiceXException( - f"Unable to find name/type {backend_name} " - "in api_endpoints in servicex.yaml configuration file. Saw" - f' only names ({", ".join(seen_names)}) and types ' - f'({", ".join(seen_types)})' - ) - - # Nope - now we are going to have to just use the first one there. - else: - for ep in endpoints: - log.warning( - "No backend name/type requested, " - f'using {ep["endpoint"].as_str_expanded()} - please be explicit ' - "in the ServiceXDataset constructor" - ) - config = {k: str(ep[k].as_str_expanded()) for k in ep.keys()} - break - - if config is None: - # If we are here - then... it just isn't going to work! - raise ServiceXException( - "Not even a default set of configurations are here! Bad " - " install of the servicex package!" - ) - - # Now, extract the type and see if we can figure out any defaults from the - # `backend_types` info. Skip this if we have a type we are passed in. - type_lookup = ( - backend_type - if backend_type is not None - else config["type"] - if "type" in config - else backend_name - ) - if type_lookup is None: - return config - - backend_defaults = self.settings["backend_types"] - for bd in backend_defaults: - if bd["type"].as_str_expanded() == type_lookup: - for k in bd.keys(): - if k not in config: - config[k] = str(bd[k].as_str_expanded()) - - # Finally, a default return type - if "return_data" not in config: - if "default_return_data" in self.settings.keys(): - config["return_data"] = str( - self.settings["default_return_data"].as_str_expanded() - ) - - return config - - def get_servicex_adaptor_config( - self, - backend_name: Optional[str] = None, - backend_type: Optional[str] = None, - ) -> Tuple[str, Optional[str]]: - """Return the servicex (endpoint, token) from a given backend configuration. - - Args: - backend_name (str): The backend name (like `xaod`) which we hopefully can find in the - configuration file. - - Returns: - Tuple[str, str]: The tuple of info to create a `ServiceXAdaptor`: end point, - token (optionally). - """ - config = self._get_backend_info(backend_name, backend_type) - - endpoint = config["endpoint"] - token = config["token"] if "token" in config else None - - # We can default these to "None" - return (endpoint, token) # type: ignore diff --git a/servicex/servicex_python_function.py b/servicex/servicex_python_function.py deleted file mode 100644 index c3b3adcd..00000000 --- a/servicex/servicex_python_function.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2022 , IRIS-HEP -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# -# -# -import inspect -from base64 import b64encode -from pathlib import Path -from typing import Optional, List, Callable - -from servicex import ServiceXDataset - - -class ServiceXPythonFunction(ServiceXDataset): - @staticmethod - def _encode_function(selection_function: Callable): - return b64encode(inspect.getsource(selection_function).encode("utf-8")).decode( - "utf-8" - ) - - async def get_data_rootfiles_async( - self, selection_function: Callable, title: Optional[str] = None - ) -> List[Path]: - return await self._file_return( - self._encode_function(selection_function), "root-file", title - ) - - async def get_data_awkward_async( - self, selection_function: Callable, title: Optional[str] = None - ): - return self._converter.combine_awkward( - await self._data_return( - self._encode_function(selection_function), - lambda f: self._converter.convert_to_awkward(f), - title, - ) - ) diff --git a/servicex/servicex_utils.py b/servicex/servicex_utils.py deleted file mode 100644 index e296ad3c..00000000 --- a/servicex/servicex_utils.py +++ /dev/null @@ -1,60 +0,0 @@ -import asyncio -from typing import Dict -import functools -import logging - -from .utils import _string_hash, clean_linq - -_in_progress_items: Dict[str, asyncio.Event] = {} - - -def _wrap_in_memory_sx_cache(fn): - """ - Caching wrapper. This is like lru in python, but we have to fetch some more - "interesting" data from the object we are wrapping to complete the cache key. Hence - this implementation. - - NOTE: This is not thread safe. In fact, you'll likely get a bomb if try to - call this from another thread and the two threads request something the - same at the same time. This is because asyncio locks are associated with loops, - and there is one loop per thread. - """ - - @functools.wraps(fn) - async def cached_version_of_fn(*args, **kwargs): - assert len(args) == 2 or len(args) == 3 - sx = args[0] - from .servicex import ServiceXDataset - - assert isinstance(sx, ServiceXDataset) - selection_query = args[1] - assert isinstance(selection_query, str) - - # Is it in the local cache? - h = _string_hash([sx._dataset, fn.__name__, clean_linq(selection_query)]) - logger = logging.getLogger(__name__) - if h in _in_progress_items: - logger.debug(f"{h} - waiting for processing") - await _in_progress_items[h].wait() - logger.debug(f"{h} - done waiting for processing") - - # Is it already done? - r = sx._cache.lookup_inmem(h) - if r is not None: - return r - - # It is not. We need to calculate it, and prevent - # others from working on it. - _in_progress_items[h] = asyncio.Event() - try: - logger.debug(f"{h} - processing request") - result = await fn(*args, **kwargs) - sx._cache.set_inmem(h, result) - finally: - logger.debug(f"{h} - done processing request") - _in_progress_items[h].set() - del _in_progress_items[h] - - return result - - return cached_version_of_fn diff --git a/servicex/servicexabc.py b/servicex/servicexabc.py deleted file mode 100644 index c95d47db..00000000 --- a/servicex/servicexabc.py +++ /dev/null @@ -1,182 +0,0 @@ -from abc import ABC, abstractmethod -from pathlib import Path -from typing import Dict, List, Optional - -from make_it_sync import make_sync -import awkward as ak -import pandas as pd - -from .utils import ( - DatasetType, - StatusUpdateFactory, - _null_progress_feedback, - _run_default_wrapper, - _status_update_wrapper, - dataset_as_name, -) - - -class ServiceXABC(ABC): - """ - Abstract base class for accessing the ServiceX front-end for a particular dataset. This does - have some implementations, but not a full set (hence why it isn't an ABC). - - A light weight, mostly immutable, base class that holds basic configuration information for use - with ServiceX file access, including the dataset name. Subclasses implement the various access - methods. Note that not all methods may be accessible! - """ - - def __init__( - self, - dataset: DatasetType, - codegen: Optional[str] = None, - image: Optional[str] = None, - max_workers: int = 20, - result_destination: str = "object-store", - status_callback_factory: Optional[StatusUpdateFactory] = _run_default_wrapper, - ): - """ - Create and configure a ServiceX object for a dataset. - - Arguments - - dataset Name of a dataset from which queries will be selected. - codegen The type of code generator passed to the backend to - generate the code that powers the requested transform. - image Name of transformer image to use to transform the data. If - None the default implementation is used. - cache_adaptor Runs the caching for data and queries that are sent up and - down. - max_workers Maximum number of transformers to run simultaneously on - ServiceX. - result_destination Where the transformers should write the results. - Defaults to object-store, but could be used to save - results to a posix volume - cache_path Path to the cache - status_callback_factory Factory to create a status notification callback for each - query. One is created per query. - - - Notes: - - - The `status_callback` argument, by default, uses the `tqdm` library to render - progress bars in a terminal window or a graphic in a Jupyter notebook (with proper - jupyter extensions installed). If `status_callback` is specified as None, no - updates will be rendered. A custom callback function can also be specified which - takes `(total_files, transformed, downloaded, skipped)` as an argument. The - `total_files` parameter may be `None` until the system knows how many files need to - be processed (and some files can even be completed before that is known). - """ - self._dataset = dataset - self._codegen = codegen - self._image = image - self._max_workers = max_workers - self._result_destination = result_destination - - # We can't create the notifier until the actual query, - # so only need to save the status update. - self._status_callback_factory = ( - status_callback_factory - if status_callback_factory is not None - else _null_progress_feedback - ) - - @property - def dataset_as_name(self) -> str: - """Return the dataset name as a string for "human" consumption. - - Note that this can be very very long! - - Returns: - str: The dataset name formatted as a string - """ - return dataset_as_name(self._dataset, max_len=None) - - def _create_notifier( - self, title: Optional[str], downloading: bool - ) -> _status_update_wrapper: - "Internal method to create a updater from the status call-back" - return _status_update_wrapper( - self._status_callback_factory(self._dataset, title, downloading) - ) - - @abstractmethod - async def get_data_rootfiles_async( - self, selection_query: str, title: Optional[str] = None - ) -> List[Path]: - """ - Fetch query data from ServiceX matching `selection_query` and return it as - a list of root files. The files are uniquely ordered (the same query will always - return the same order). - - Arguments: - selection_query The `qastle` string specifying the data to be queried - title Title reported to the ServiceX backend for status reporting - - Returns: - root_files The list of root files - """ - - @abstractmethod - async def get_data_pandas_df_async( - self, selection_query: str, title: Optional[str] = None - ) -> pd.DataFrame: - """ - Fetch query data from ServiceX matching `selection_query` and return it as - a pandas DataFrame. The data is uniquely ordered (the same query will always - return the same order). - - Arguments: - selection_query The `qastle` string specifying the data to be queried - title Title reported to the ServiceX backend for status reporting - - Returns: - df The pandas DataFrame - - Exceptions: - xxx If the data is not the correct shape (e.g. a flat, - rectangular table). - """ - - @abstractmethod - async def get_data_awkward_async( - self, selection_query: str, title: Optional[str] = None - ) -> Dict[bytes, ak.Array]: - """ - Fetch query data from ServiceX matching `selection_query` and return it as - dictionary of awkward arrays, an entry for each column. The data is uniquely - ordered (the same query will always return the same order). - - Arguments: - selection_query The `qastle` string specifying the data to be queried - title Title reported to the ServiceX backend for status reporting - - Returns: - a Dictionary of jagged arrays (as needed), one for each - column. The dictionary keys are `bytes` to support possible - unicode characters. - """ - - @abstractmethod - async def get_data_parquet_async( - self, selection_query: str, title: Optional[str] = None - ) -> List[Path]: - """ - Fetch query data from ServiceX matching `selection_query` and return it as - a list of parquet files. The files are uniquely ordered (the same query will always - return the same order). - - Arguments: - selection_query The `qastle` string specifying the data to be queried - title Title reported to the ServiceX backend for status reporting - - Returns: - root_files The list of parquet files - """ - - # Define the synchronous versions of the async methods for easy of use - - get_data_rootfiles = make_sync(get_data_rootfiles_async) - get_data_pandas_df = make_sync(get_data_pandas_df_async) - get_data_awkward = make_sync(get_data_awkward_async) - get_data_parquet = make_sync(get_data_parquet_async) diff --git a/servicex/utils.py b/servicex/utils.py deleted file mode 100644 index 27bc1a9d..00000000 --- a/servicex/utils.py +++ /dev/null @@ -1,695 +0,0 @@ -from datetime import timedelta -from hashlib import blake2b -import os -from pathlib import Path, PurePath -import re -import tempfile -import threading -from typing import AsyncIterator, Callable, Dict, Iterable, Optional, Tuple, Union - -import aiohttp -from confuse.core import ConfigView -from lark import Token, Transformer -from qastle import parse - - -# Access to thread local storage. -threadLocal = threading.local() - - -async def default_client_session() -> aiohttp.ClientSession: - """ - Return a client session per thread. - """ - client = getattr(threadLocal, "client_session", None) - if client is None: - connector = aiohttp.TCPConnector(limit=20) - client = await aiohttp.ClientSession(connector=connector).__aenter__() - threadLocal.client_session = client - return client - - -def write_query_log( - request_id: str, - n_files: Optional[int], - n_skip: int, - time: timedelta, - success: bool, - path_to_log_dir: Path, -): - """ - Log to a csv file the status of a run. - """ - l_file = path_to_log_dir / "log.csv" - if l_file.parent.exists(): - if not l_file.exists(): - l_file.write_text("RequestID,n_files,n_skip,time_sec,no_error\n") - with l_file.open(mode="a") as f: - s_text = "1" if success else "0" - f.write( - f"{request_id},{n_files if n_files is not None else -1}," - f"{n_skip},{time.total_seconds()},{s_text}\n" - ) - - -class log_adaptor: - """ - Helper method to allow easy mocking. - """ - - @staticmethod - def write_query_log( - request_id: str, - n_files: Optional[int], - n_skip: int, - time: timedelta, - success: bool, - path_to_log_dir: Path, - ): - write_query_log(request_id, n_files, n_skip, time, success, path_to_log_dir) - - -class ServiceXException(Exception): - "Raised when something has gone wrong in the ServiceX remote service" - - def __init__(self, msg): - super().__init__(self, msg) - - -class ServiceXFatalTransformException(Exception): - "Raised when something has gone wrong in the ServiceX remote service" - - def __init__(self, msg): - super().__init__(self, msg) - - -class ServiceXUnknownRequestID(Exception): - "Raised when we try to access ServiceX with a request ID it does not know about" - - def __init__(self, msg): - super().__init__(self, msg) - - -class ServiceXNoFilesInCache(Exception): - """Raised when we try to access ServiceX with a request ID that it - knows about, but no longer has the results cached - and they - need to be regenerated" - """ - - def __init__(self, msg): - super().__init__(self, msg) - - -class ServiceXUnknownDataRequestID(Exception): - """Raised when we expect ServiceX to know about the data for a request id, but it does not. - Possible causes: - - - ServiceX has been reset and all previously run requests have been removed - - ServiceX's cache rolled over this entry, and it wasn't cached locally. - """ - - def __init__(self, msg): - super().__init__(self, msg) - - -class ServiceXFailedFileTransform(Exception): - "Raised when a file(s) fail to transform" - - def __init__(self, msg): - super().__init__(self, msg) - - -def sanitize_filename(fname: str): - "No matter the string given, make it an acceptable filename" - return fname.replace("*", "_").replace(";", "_").replace(":", "_") - - -# Datasets can be specified in multiple ways -# to ServiceX. This datatype encapsulates them -# all. -DatasetType = Union[ - str, # A single URI with a scheme (e.g. rucio://did_name, http://, root://) - Iterable[str], # A list of http:// or root:// files to be directly accessed -] - -StatusUpdateCallback = Callable[[Optional[int], int, int, int], None] -# The sig of the call-back. Arguments are: -# 1. Processed -# 1. Downloaded -# 1. Remaining -# 1. Failed - -StatusUpdateFactory = Callable[[DatasetType, Optional[str], bool], StatusUpdateCallback] -# Factory method that returns a factory that can run the status callback -# First argument is a string, second argument is True if a download progress -# bar can be displayed as well. - - -class _status_update_wrapper: - """ - Internal class to make it easier to deal with the updater - """ - - def __init__(self, callback: Optional[StatusUpdateCallback] = None): - self._callback = callback - self.reset() - - def reset(self): - "Reset back to zero" - self._total: Optional[int] = None - self._processed: Optional[int] = None - self._downloaded: Optional[int] = None - self._failed: int = 0 - self._remaining: Optional[int] = None - - @property - def total(self) -> Optional[int]: - return self._total - - @property - def failed(self) -> int: - return self._failed - - def broadcast(self): - "Send an update back to the system" - if self._callback is not None: - processed = self._processed if self._processed is not None else 0 - downloaded = self._downloaded if self._downloaded is not None else 0 - failed = self._failed if self._failed is not None else 0 - self._callback(self._total, processed, downloaded, failed) - - def _update_total(self): - "Update total number of files, without letting inconsistencies change things" - if ( - self._processed is not None - and self._remaining is not None - and self._failed is not None - ): - total = self._remaining + self._processed + self._failed - if self._total is None: - self._total = total - else: - if self._total < total: - self._total = total - - def update( - self, - processed: Optional[int] = None, - downloaded: Optional[int] = None, - remaining: Optional[int] = None, - failed: Optional[int] = None, - ): - if processed is not None: - self._processed = processed - if downloaded is not None: - self._downloaded = downloaded - if failed is not None: - self._failed = failed - if remaining is not None: - self._remaining = remaining - self._update_total() - - def inc(self, downloaded: Optional[int] = None): - if downloaded is not None: - if self._downloaded is None: - self._downloaded = downloaded - else: - self._downloaded += downloaded - - -TransformTuple = Tuple[Optional[int], int, Optional[int]] - - -async def stream_status_updates( - stream: AsyncIterator[TransformTuple], notifier: _status_update_wrapper -): - """ - As the transformed status goes by, update the notifier with the new - values. - """ - async for p in stream: - remaining, processed, failed = p - notifier.update(processed=processed, failed=failed, remaining=remaining) - notifier.broadcast() - yield p - - -async def stream_unique_updates_only(stream: AsyncIterator[TransformTuple]): - """ - As status goes by, only let through changes - """ - last_p: Optional[TransformTuple] = None - async for p in stream: - if p != last_p: - last_p = p - yield p - - -def _run_default_wrapper( - ds_name: DatasetType, title: Optional[str], downloading: bool -) -> StatusUpdateCallback: - """Create a feedback object for everyone to use to pass feedback to. Uses tqdm (default). - - Args: - ds_name (str): The dataset name - downloading (bool): True if we will be downloading the files, not just processing them. - - Returns: - StatusUpdateCallback: The updater callback - """ - return _default_wrapper_mgr(ds_name, title, downloading).update - - -def _null_progress_feedback( - ds_name: DatasetType, title: Optional[str], downloading: bool -) -> None: - """ - Internal routine to create a feedback object that does not - give anyone feedback! - """ - return None - - -def dataset_as_name( - sample_name: Optional[DatasetType], - title: Optional[str] = None, - max_len: Optional[int] = 20, -) -> str: - """Returns a name that is suitable for a progress bar - - Args: - sample_name (str): The sample info - title (Optional[str]): The title specified with the request - max_len (Optional[int]): The maximum length of the title. None - means no length limit. - - Returns: - str: Name to use for a progress bar - """ - if title is not None: - name = title - else: - if sample_name is not None: - name = ( - sample_name - if isinstance(sample_name, str) - else f"[{', '.join(sample_name)}]" - ) - else: - name = "" - - if (max_len is not None) and (len(name) > max_len): - name = name[0:max_len] + "..." - - return name - - -# Hack to work around tqdm not understanding vscode notebooks (see #186). -if "VSCODE_PID" in os.environ.keys(): # pragma: no cover - from tqdm.notebook import tqdm -else: - from tqdm.auto import tqdm - - -class _default_wrapper_mgr: - "Default progress bar" - - def __init__( - self, - sample_name: Optional[DatasetType] = None, - title: Optional[str] = None, - show_download_bar: bool = True, - ): - self._tqdm_p: Optional[tqdm] = None - self._tqdm_d: Optional[tqdm] = None - self._show_download_progress = show_download_bar - self._name = dataset_as_name(sample_name, title) - - def _init_tqdm(self): - if self._tqdm_p is not None: - return - - self._tqdm_p = tqdm( - total=9e9, - desc=self._name, - unit="file", - leave=False, - dynamic_ncols=True, - bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}]", - ) - if self._show_download_progress: - self._tqdm_d = tqdm( - total=9e9, - desc=f" {self._name} Downloaded", - unit="file", - leave=False, - dynamic_ncols=True, - bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}]", - ) - - def _update_bar( - self, bar: Optional[tqdm], total: Optional[int], num: int, failed: int - ): - assert bar is not None, "Internal error - bar was not initialized" - if total is not None: - if bar.total != total: - # There is a bug in the tqm library if running in a notebook - # See https://github.com/tqdm/tqdm/issues/688 - # This forces us to do the reset, sadly. - old_num = bar.n # type: int - bar.reset(total) - bar.update(old_num) - bar.update(num - bar.n) - bar.refresh() - - if total is not None and (num + failed) == total: - bar.close() - - def update( - self, total: Optional[int], processed: int, downloaded: int, failed: int - ): - self._init_tqdm() - self._update_bar(self._tqdm_p, total, processed, failed) - if self._show_download_progress: - self._update_bar(self._tqdm_d, total, downloaded, failed) - - -# Changes in the json that won't affect the result -_json_keys_to_ignore_for_hash = ["workers", "title"] - - -def _query_cache_hash(json_query: Dict[str, str]) -> str: - """ - Return a query cache file. - """ - hasher = blake2b(digest_size=20) - for k, v in json_query.items(): - if k not in _json_keys_to_ignore_for_hash: - if k == "selection": - v = clean_linq(v) - hasher.update(k.encode()) - hasher.update(str(v).encode()) - hash = hasher.hexdigest() - return hash - - -def _string_hash(s_list: Iterable[Union[str, Iterable[str]]]) -> str: - """ - Return a hash for an input list of strings. - """ - hasher = blake2b(digest_size=20) - for v in s_list: - if isinstance(v, str): - hasher.update(v.encode()) - else: - for v1 in v: - hasher.update(v1.encode()) - hash = hasher.hexdigest() - return hash - - -def clean_linq(q: str) -> str: - """ - Normalize the variables in a qastle expression. Should make the - linq expression more easily comparable even if the algorithm that - generates the underlying variable numbers changes. If the selection algorithm will violate - the qastle syntax, it is returned unaltered and with no errors. - - Arguments - - q String containing the qastle code` - - Returns - - clean_q Sanitized query - lambda arguments are given a uniform source code - labeling so that two queries with the same structure are marked as the same. - """ - from collections import namedtuple - - ParseTracker = namedtuple("ParseTracker", ["text", "info"]) - - arg_index = 0 - - def new_arg(): - nonlocal arg_index - s = f"a{arg_index}" - arg_index += 1 - return s - - def _replace_strings(s: str, rep: Dict[str, str]) -> str: - "Replace all strings in dict that are found in s" - for k in rep.keys(): - s = re.sub(f"\\b{k}\\b", rep[k], s) - return s - - class translator(Transformer): - def record(self, children): - if ( - len(children) == 0 - or isinstance(children[0], Token) - and children[0].type == "WHITESPACE" - ): # type: ignore - return "" - else: - return children[0].text # type: ignore - - def expression(self, children): - for child in children: - if isinstance(child, ParseTracker): - return child - raise SyntaxError("Expression does not contain a node") - - def atom(self, children): - child = children[0] - return ParseTracker(child.value, child.value) - - def composite(self, children): - fields = [] - node_type: Optional[str] = None - for child in children: - if isinstance(child, Token): - if child.type == "NODE_TYPE": # type: ignore - node_type = child.value # type: ignore - elif isinstance(child, ParseTracker): - fields.append(child) - - assert node_type is not None - - if node_type == "lambda": - if len(fields) != 2: - raise ServiceXException( - f'The qastle "{q}" is not valid - found a lambda ' - f"expression with {len(fields)} arguments - not the required 2!" - ) - arg_list = [f.info for f in fields[0].info] - arg_mapping = {old: new_arg() for old in arg_list} - fields[0] = ParseTracker( - f'(list {" ".join(arg_mapping[k] for k in arg_list)})', - [ParseTracker(arg_mapping[f], arg_mapping[f]) for f in arg_list], - ) - fields[1] = ParseTracker( - _replace_strings(fields[1].text, arg_mapping), fields[1].info - ) - - return ParseTracker( - f'({node_type} {" ".join([f.text for f in fields])})', fields - ) - - try: - tree = parse(q) - new_tree = translator().transform(tree) - assert isinstance(new_tree, str) - return new_tree - except Exception: - return q - - -def get_configured_cache_path(config: ConfigView) -> Path: - """ - From the configuration info return a valid path for us to store our cached files. - """ - assert config[ - "cache_path" - ].exists(), "Cannot find default config - install is broken" - s_path = config["cache_path"].as_str_expanded() - assert isinstance(s_path, str) - - # If they have tried to use the USER or UserName as an expansion, and it has failed, then - # translate it to maintain harmony across platforms. - if "${USER}" in s_path and "UserName" in os.environ: - s_path = s_path.replace("${USER}", os.environ["UserName"]) - if "${UserName}" in s_path and "USER" in os.environ: - s_path = s_path.replace("${UserName}", os.environ["USER"]) - - p_p = PurePath(s_path) - if len(p_p.parts) > 1 and p_p.parts[1] == "tmp": - p = Path(tempfile.gettempdir()) / Path(*p_p.parts[2:]) - else: - p = Path(p_p) - p.mkdir(exist_ok=True, parents=True) - return p - - -# Below is copied and very lightly modified from the backoff library -# See https://github.com/litl/backoff/issues/131 - - -from backoff import full_jitter # noqa: E402 -from backoff._common import ( # noqa: E402 - _prepare_logger, - _config_handlers, - _log_giveup, - _log_backoff, - _maybe_call, - _init_wait_gen, - _next_wait, -) -import logging # noqa: E402 -from backoff._async import ( # noqa: E402 - _ensure_coroutines, - _ensure_coroutine, - _call_handlers, -) -import asyncio # noqa: E402 -import functools # noqa: E402 -import datetime # noqa: E402 - - -def retry_exception_itr( - target, - wait_gen, - exception, - max_tries, - max_time, - jitter, - giveup, - on_success, - on_backoff, - on_giveup, - wait_gen_kwargs, -): - on_success = _ensure_coroutines(on_success) - on_backoff = _ensure_coroutines(on_backoff) - on_giveup = _ensure_coroutines(on_giveup) - giveup = _ensure_coroutine(giveup) - - # Easy to implement, please report if you need this. - assert not asyncio.iscoroutinefunction(max_tries) - assert not asyncio.iscoroutinefunction(jitter) - - @functools.wraps(target) - async def retry(*args, **kwargs): - # change names because python 2.x doesn't have nonlocal - max_tries_ = _maybe_call(max_tries) - max_time_ = _maybe_call(max_time) - - tries = 0 - start = datetime.datetime.now() - wait = _init_wait_gen(wait_gen, wait_gen_kwargs) - while True: - tries += 1 - elapsed = timedelta.total_seconds(datetime.datetime.now() - start) - details = { - "target": target, - "args": args, - "kwargs": kwargs, - "tries": tries, - "elapsed": elapsed, - } - - got_one_item = False - try: - async for item in target(*args, **kwargs): - got_one_item = True - yield item - except exception as e: - # If we've already fed a result out of this method, - # we can't pull it back. So don't try to pull back/retry - # the exception either. - if got_one_item: - raise - - giveup_result = await giveup(e) - max_tries_exceeded = tries == max_tries_ - max_time_exceeded = max_time_ is not None and elapsed >= max_time_ - - if giveup_result or max_tries_exceeded or max_time_exceeded: - await _call_handlers(on_giveup, **details) - raise - - try: - seconds = _next_wait( - wait, giveup_result, jitter, elapsed, max_time_ - ) - except StopIteration: # pragma: no cover - await _call_handlers(on_giveup, **details) - raise e - - await _call_handlers(on_backoff, **details, wait=seconds) - - # Note: there is no convenient way to pass explicit event - # loop to decorator, so here we assume that either default - # thread event loop is set and correct (it mostly is - # by default), or Python >= 3.5.3 or Python >= 3.6 is used - # where loop.get_event_loop() in coroutine guaranteed to - # return correct value. - # See for details: - # - # - await asyncio.sleep(seconds) - else: - await _call_handlers(on_success, **details) - return - - return retry - - -def on_exception_itr( - wait_gen, - exception, - max_tries=None, - max_time=None, - jitter=full_jitter, - giveup=lambda e: False, - on_success=None, - on_backoff=None, - on_giveup=None, - logger="backoff", - backoff_log_level=logging.INFO, - giveup_log_level=logging.ERROR, - **wait_gen_kwargs, -): - def decorate(target): - # change names because python 2.x doesn't have nonlocal - logger_ = _prepare_logger(logger) - - on_success_ = _config_handlers(on_success) - on_backoff_ = _config_handlers( - on_backoff, - default_handler=_log_backoff, - logger=logger_, - log_level=backoff_log_level, - ) - on_giveup_ = _config_handlers( - on_giveup, - default_handler=_log_giveup, - logger=logger_, - log_level=giveup_log_level, - ) - - return retry_exception_itr( - target, - wait_gen, - exception, - max_tries, - max_time, - jitter, - giveup, - on_success_, - on_backoff_, - on_giveup_, - wait_gen_kwargs, - ) - - # Return a function which decorates a target with a retry loop. - return decorate diff --git a/setup.py b/setup.py deleted file mode 100644 index be40c552..00000000 --- a/setup.py +++ /dev/null @@ -1,91 +0,0 @@ -# setuptools loads some plugins necessary for use here. -from setuptools import find_packages # noqa: F401 -from distutils.core import setup -import sys -import os - -# Use the readme as the long description. -with open("README.md", "r") as fh: - long_description = fh.read() - -extra_test_packages = [] -if sys.version_info[1] < 8: - extra_test_packages.append("asyncmock") - -version = os.getenv("servicex_version") -if version is None: - version = "0.1a1" -else: - version = version.split("/")[-1] - -setup( - name="servicex", - version=version, - packages=["servicex"], - scripts=[], - description="Front-end for the ServiceX Data Server", - long_description=long_description, - long_description_content_type="text/markdown", - author="G. Watts (IRIS-HEP/UW Seattle)", - author_email="gwatts@uw.edu", - maintainer="Gordon Watts (IRIS-HEP/UW Seattle)", - maintainer_email="gwatts@uw.edu", - url="https://github.com/ssl-hep/ServiceX_frontend", - license="TBD", - python_requires=">=3.7", - test_suite="tests", - install_requires=[ - "idna==2.10", # Required to thread version needle with requests library - "pandas~=1.0", - "uproot>=4.0.1, <5", - "awkward>=1.0.1, <2", - "backoff>=2.0", - "aiohttp~=3.6", - "minio~=5.0", - "tqdm~=4.0", - "qastle>=0.10", - "make_it_sync>= 1.0.0", - "google-auth", - "confuse", - "pyarrow>=1.0", - ], - extras_require={ - "test": [ - "pytest>=3.9", - "pytest-asyncio", - "pytest-mock", - "pytest-cov", - "coverage", - "flake8", - "codecov", - "autopep8", - "twine", - "asyncmock", - "jupyterlab", - "ipywidgets", - "black", - ] - + extra_test_packages, - }, - classifiers=[ - "Development Status :: 3 - Alpha", - # "Development Status :: 4 - Beta", - # "Development Status :: 5 - Production/Stable", - # "Development Status :: 6 - Mature", - "Intended Audience :: Developers", - "Intended Audience :: Information Technology", - "Programming Language :: Python", - "Topic :: Software Development", - "Topic :: Utilities", - "Programming Language :: Python", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - ], - package_data={ - "servicex": ["config_default.yaml"], - }, - platforms="Any", -) diff --git a/tests/.flake8 b/tests/.flake8 deleted file mode 100644 index 059ce015..00000000 --- a/tests/.flake8 +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -max-line-length = 1000000 -ignore = F811 diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 60fcaaa8..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,245 +0,0 @@ -from json import loads -from pathlib import Path - -import asyncmock -from servicex.data_conversions import DataConverterAdaptor -from servicex.minio_adaptor import MinioAdaptor -from typing import Any, Dict, List, Optional, Tuple -from unittest.mock import Mock - -import aiohttp -import pytest -from pytest_mock import MockFixture - -from servicex.cache import Cache - - -class ClientSessionMocker: - def __init__(self, text, status): - if type(text) == list: - self._text_iter = iter(text) - else: - self._text_iter = iter([text]) - - if type(status) == list: - self._status_iter = iter(status) - else: - self._status_iter = iter([status]) - - async def text(self): - return next(self._text_iter) # type: ignore - - async def json(self): - return loads(next(self._text_iter)) # type: ignore - - @property - def status(self): - return next(self._status_iter) # type: ignore - - async def __aexit__(self, exc_type, exc, tb): - pass - - async def __aenter__(self): - return self - - -class MockServiceXAdaptor: - def __init__( - self, - mocker: MockFixture, - request_id: str, - mock_transform_status: Optional[Mock] = None, - mock_query: Optional[Mock] = None, - mock_transform_query_status: Optional[Mock] = None, - ): - self.request_id = request_id - self._endpoint = "http://localhost:5000" - self.requests_made = 0 - - def do_unique_id(): - id = self.request_id.format(self.requests_made) - self.requests_made += 1 - return {"request_id": id} - - self.query = mock_query if mock_query else mocker.Mock(side_effect=do_unique_id) - - self.transform_status = ( - mock_transform_status - if mock_transform_status - else mocker.Mock(return_value=(0, 1, 0)) - ) - - self.query_status = ( - mock_transform_query_status if mock_transform_query_status else None - ) - - self.dump_query_errors_count = 0 - - async def submit_query( - self, client: aiohttp.ClientSession, json_query: Dict[str, str] - ) -> str: - self.query_json = json_query - return self.query() - - async def get_transform_status( - self, client: str, request_id: str - ) -> Tuple[Optional[int], int, Optional[int]]: - # remaining, processed, skipped - return self.transform_status() - - async def get_query_status(self, client, request_id): - if self.query_status is None: - return { - "request_id": request_id, - "dude": "way", - } - return self.query_status() - - async def dump_query_errors(self, client, request_id): - self.dump_query_errors_count += 1 - - -class MockMinioAdaptor(MinioAdaptor): - def __init__( - self, - mocker: MockFixture, - files: List[str] = [], - exception_on_access: Optional[Exception] = None, - ): - self._files = files - self.mock_download_file = mocker.Mock() - self._access_called_with = None - self._exception_on_access = exception_on_access - pass - - async def download_file( - self, request_id: str, minio_object_name: str, final_path: Path - ): - self.mock_download_file(request_id, minio_object_name, final_path) - - def get_files(self, request_id) -> List[str]: - "Return files in the bucket" - return self._files - - def get_access_url(self, request_id: str, object_name: str) -> str: - self._access_called_with = (request_id, object_name) - if self._exception_on_access is not None: - e = self._exception_on_access - self._exception_on_access = None - raise e - return "http://the.url.com" - - @property - def access_called_with(self) -> Optional[Tuple[str, str]]: - return self._access_called_with - - -__g_inmem_value = None - - -def build_cache_mock( - mocker, - query_cache_return: Optional[str] = None, - files: Optional[List[Tuple[str, Path]]] = None, - in_memory: Any = None, - make_in_memory_work: bool = False, - data_file_return: Optional[str] = None, - query_status_lookup_return: Optional[Dict[str, str]] = None, -) -> Cache: - c = mocker.MagicMock(spec=Cache) - - if in_memory is None: - c.lookup_inmem.return_value = None - else: - c.lookup_inmem.return_value = in_memory - - if make_in_memory_work: - - def save_it(h, v): - global __g_inmem_value - __g_inmem_value = v - - def find_it(h): - global __g_inmem_value - return __g_inmem_value - - c.set_inmem.side_effect = save_it - - c.lookup_inmem.side_effect = find_it - - if query_cache_return is None: - c.lookup_query.return_value = None - else: - c.lookup_query.return_value = query_cache_return - - if files is None: - c.lookup_files.return_value = None - else: - c.lookup_files.return_value = files - - def data_file_return_generator(request_id: str, fname: str): - return Path(f"/tmp/servicex-testing/{request_id}/{fname}") - - if data_file_return is None: - c.data_file_location.side_effect = data_file_return_generator - else: - c.data_file_location.return_value = data_file_return - - if query_status_lookup_return is not None: - c.lookup_query_status.return_value = query_status_lookup_return - - c.query_status_exists.return_value = True - - return c - - -@pytest.fixture -def good_root_file_path(): - return Path("tests/sample_root_servicex_output.root") - - -@pytest.fixture -def good_uproot_file_path(): - return Path("tests/sample_uproot_servicex_output.parquet") - - -@pytest.fixture -def good_pandas_file_data(mocker): - "Return a good pandas dataset" - import pandas as pd - import asyncmock - - converter = asyncmock.MagicMock(spec=DataConverterAdaptor) - converter.convert_to_pandas.return_value = pd.DataFrame( - {"JetPt": [0, 1, 2, 3, 4, 5]} - ) - converter.combine_pandas.return_value = converter.convert_to_pandas.return_value - - return converter - - -@pytest.fixture -def good_awkward_file_data(mocker): - import awkward as ak - - converter = asyncmock.MagicMock(spec=DataConverterAdaptor) - converter.convert_to_awkward.return_value = { - "JetPt": ak.from_iter([0, 1, 2, 3, 4, 5]) - } # type: ignore - converter.combine_awkward.return_value = converter.convert_to_awkward.return_value - - return converter - - -@pytest.fixture -def short_status_poll_time(): - import servicex.servicex_adaptor as sxs - - old_value, sxs.servicex_status_poll_time = sxs.servicex_status_poll_time, 0.1 - yield - sxs.servicex_status_poll_time = old_value - - -async def as_async_seq(seq: List[Any]): - for i in seq: - yield i diff --git a/tests/sample_root_servicex_output.root b/tests/sample_root_servicex_output.root deleted file mode 100644 index d0c695814dba2afab4970f85aa392f73a4f86a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398775 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