fingertip
This program/library aims to be a way to:
- fire up VMs and containers in mere seconds using live VM snapshots
- uniformly control machines from Python by writing small and neat functions transforming them
- compose and transparently cache the results of these functions
- build cool apps that exploit live VM snapshots and checkpoints
- control other types of machines that are not local VMs
All while striving to be intentionally underengineered and imposing as few limits as possible. If you look at it and think that it does nothing in the laziest way possible, that's it.
It's currently in alpha stage.
Teaser
Some examples of executing it from your shell:
$ fingertip os.fedora + ssh # install Fedora and SSH into it
$ fingertip os.alpine + console # install Alpine, access serial console
$ fingertip os.alpine + ansible package --state=present --name=patch + ssh
$ fingertip backend.podman-criu + os.alpine + console # containers!
$ fingertip os.fedora + script.debug myscript.sh # checkpoint-powered debugger
An example of Python usage and writing your own steps:
import fingertip
def main(m=None, alias='itself'):
m = m or fingertip.build('os.fedora')
m = m.apply('ansible', 'lineinfile', path='/etc/hosts',
line=f'127.0.0.1 {alias}')
with m:
assert '1 received' in m(f'ping -c1 {alias}').out
return m
Put in fingertip/plugins/demo.py,
this can be now be used in pipelines:
$ fingertip demo
$ fingertip os.fedora + demo me
$ fingertip os.alpine + demo --alias=myself + ssh
Installation
Refer to INSTALL.md.
Shell usage
If you have installed fingertip, invoke it as fingertip.
If you're running from a checkout, use python3 <path to checkout> instead
or make an alias.
If you're using a containerized version, invoke fingertip-containerized
(and hope for the best).
So,
$ fingertip os.fedora + ssh
You should observe Fedora installation starting up, then shutting down, booting up again and, finally, giving you interactive control over the machine over SSH.
Invoke the same command again, and it should do nearly nothing, as
the downloads and the installation are already cached
in ~/.cache/fingertip.
Enjoy fresh clean VMs brought up in mere seconds.
Feel like they're already at your fingertips.
Control them from console or from Python.
Python usage
Let's see how manipulating machines can look like
(fingertip/plugins/self_test/greeting.py):
def make_greeting(m, greeting='Hello!'): # take a machine
with m: # start if needed
m.console.sendline(f"echo '{greeting}' > .greeting") # type a command
m.console.expect_exact(m.prompt) # wait for prompt
return m # cache result
@fingertip.transient # don't lock/save
def main(m, greeting='Hello!'): # take a machine
m = m.apply(make_greeting, greeting=greeting) # use cached step
with m: # start if needed
assert m('cat .greeting').out.strip() == greeting # execute command
# do not save
Plugins are regular Python functions, nothing fancy.
You can just pass them fingertip.build('fedora') and that'll work.
Even this @fingertip.transient thing
is just an optimization hint to .apply().
Here's what can happen inside such a function:
- It accepts a machine as the first argument (which may be already spun up or not, you don't know).
- It inspects it and applies more functions if it wants to,
(extra steps applied through
.applyare cached / reused if it's possible). - Should any custom steps or changes be applied,
the machine must be first spun up using a
withblock (with m as m). All modifications to the machine must happen inside that block, or risk being silently undone! - Return the machine if the result should be cached and used for the next steps.
Not returning one can and usually will undo all the changes you've made.
If you don't intend to save the result, don't return m;
additionally, decorate the function with
@fingertip.transientso that fingertip can apply performance optimizations and avoid locking. There's much more to it, seedocs/on_transiency.mdfor details.
The first function in the chain (or the one used in fingertip.build)
will not get a machine as the first argument.
To write a universal function, just use:
def func(m=None):
m = m or fingertip.build('fedora')
...
Disclaimer
Due to what exactly I cache and the early stage of development,
empty your ~/.cache/fingertip/machines often, at least after each update.
$ fingertip cleanup machines all
Some days the whole ~/.cache/fingertip has to go.
$ fingertip cleanup everything
Metadata
Release files for fingertip 0.3.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| fingertip-0.3.7.tar.gz | 58.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fingertip-0.3.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 137.6 kB
Release files / fingertip-0.3.7.tar.gz
| Download URL | fingertip-0.3.7.tar.gz |
|---|---|
| Size | 58.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0dbc05d48d2dd4c0e7cf1ac5c4af0df536d5897831a24e3e6fb9dd9becb9e934
|
|
BLAKE2b-256 checksum How to use checksums |
5727c305816c7aca1c720c1f61a6c8143a36932af3d720c2d47d2e012bdd02e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.0.5 CPython/3.9.7 Linux/5.14.14-200.fc34.x86_64
|
Release files / fingertip-0.3.7-py3-none-any.whl
| Download URL | fingertip-0.3.7-py3-none-any.whl |
|---|---|
| Size | 79.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f4697f44b9cf5fb6b82353035e167b336579d5d9c02e52bc03f507d133260210
|
|
BLAKE2b-256 checksum How to use checksums |
73541b87f48c14ded972ea1df9e293041d5d2cde5e1576e6616ae283d627eeac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.0.5 CPython/3.9.7 Linux/5.14.14-200.fc34.x86_64
|
Security for fingertip 0.3.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.