This issue is coauthored by @zz1874.
looper is a CLI tool that often runs on the front node of a HPC cluster, so jobs can be submitted to Slurm / SGE / other job schedulers.
@nsheff expressed desire for a HTTP API for looper which wraps around looper. That would allow him and other users to run looper on the front node and use a reverse SSH tunnel from a different machine to send HTTP requests to the HTTP API.
Advantages of this would be
- use of
looper functionalities from any machine without manually copying code to the frontend node,
- potential for a graphical user interface (GUI) that builds upon that API.
An earlier attempt of this was caravel (https://github.com/pepkit/caravel). @nsheff tells us that there were issues, possibly due to the synchronous nature of the Flask framework. caravel seems to be a Python 2.7 code base that uses 2to3 to convert to Python 3 code on-the-fly during installation via setuptools' use_2to3. This makes it, in the meantime, hard to run caravel for reasons such as: setuptools doesn't come with use_2to3 anymore, the Docker image cannot be built anymore, Debian index URLs are out of date, Python 3.6-specific typing imports are used, ...
After browsing the looper and caravel code, we identified the following possibilities:
- Revive
caravel, meaning bringing it up-to-date with recent Python versions and making it compatible with recent looper versions,
- Write a new HTTP API from scratch, which leaves us at least three possibilities:
- Figure out a way of automagically creating both CLI and HTTP API from a single definition of commands / options.
This would likely be the most sustainable idea, as it prevents the need of keeping CLI and HTTP API in sync if commands / options are added / removed in the future. But it would possibly be a larger undertaking with the risk of being only partially finished in the limited time we can work on it. It would also possibly make a nice separate, reusable library!
- Implement only the most important top-level commands and their options as HTTP API endpoints, but design this easily transferable to other commands and document the development process. That way, a subset of the
looper commands / options could likely be made available via the HTTP API in the little development time we have. But this also means an increased maintenance burden - if a new CLI command / option is added, the HTTP API and its documentation have to be adapted accordingly.
- Implement only top-level commands and allow setting of flags / options only via a project configuration file that is
POSTed to the API. This would be the easiest and quickest solution, but limits the use cases of the API. A similarly easy and inflexible approach would be POSTing a string of command lines argument that is then parsed by looper's existing argparse argument parser.
Important questions that would need to be answered:
And finally, of course:
This issue is coauthored by @zz1874.
looperis a CLI tool that often runs on the front node of a HPC cluster, so jobs can be submitted to Slurm / SGE / other job schedulers.@nsheff expressed desire for a HTTP API for
looperwhich wraps aroundlooper. That would allow him and other users to runlooperon the front node and use a reverse SSH tunnel from a different machine to send HTTP requests to the HTTP API.Advantages of this would be
looperfunctionalities from any machine without manually copying code to the frontend node,An earlier attempt of this was
caravel(https://github.com/pepkit/caravel). @nsheff tells us that there were issues, possibly due to the synchronous nature of the Flask framework.caravelseems to be a Python 2.7 code base that uses2to3to convert to Python 3 code on-the-fly during installation viasetuptools'use_2to3. This makes it, in the meantime, hard to runcaravelfor reasons such as:setuptoolsdoesn't come withuse_2to3anymore, the Docker image cannot be built anymore, Debian index URLs are out of date, Python 3.6-specific typing imports are used, ...After browsing the
looperandcaravelcode, we identified the following possibilities:caravel, meaning bringing it up-to-date with recent Python versions and making it compatible with recentlooperversions,This would likely be the most sustainable idea, as it prevents the need of keeping CLI and HTTP API in sync if commands / options are added / removed in the future. But it would possibly be a larger undertaking with the risk of being only partially finished in the limited time we can work on it. It would also possibly make a nice separate, reusable library!
loopercommands / options could likely be made available via the HTTP API in the little development time we have. But this also means an increased maintenance burden - if a new CLI command / option is added, the HTTP API and its documentation have to be adapted accordingly.POSTed to the API. This would be the easiest and quickest solution, but limits the use cases of the API. A similarly easy and inflexible approach would bePOSTing a string of command lines argument that is then parsed bylooper's existingargparseargument parser.Important questions that would need to be answered:
loopershould we develop against?looperis currently at v1.5.1, but there is a PR open for v.1.6.0, and in fact we could only get thehello_looperexample working with the future v1.6.0 oflooper. A similar question holds forpipestat, if required for development of the HTTP API. The answer is: v.1.6.0 forlooperand v0.6.0 forpipestat, as both new versions have now been released.caravel? Knowing them would help us make a more informed decision whether to possibly revivecaravelor to redevelop from scratch, avoiding mistakes made incaravel. Answer: Discussion: add HTTP API forlooper#433 (comment)loopercommands: which commands have the highest priority and should thus be implemented first as HTTP API calls? Answer:looper run,looper runp,looper check,looper report(Discussion: add HTTP API forlooper#433 (comment))And finally, of course: