Skip to main content

Control VMs, containers and other machines with Python, leverage live snapshots

Project description

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!

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, compressing an image, 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

These are regular Python functions, nothing fancy. Even this @fingertip.transient thing is an optimization-only hint. You can just pass them fingertip.build('fedora') and that'll work.

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 .apply are cached / reused if it's possible).
  • Should any custom steps or changes be applied, the machine must be first spun up using a with block (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.transient or at least use .transient() with with, so that fingertip can apply performance optimizations and be even faster.

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 all

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fingertip-0.2.1.tar.gz (33.5 kB view details)

Uploaded Source

Built Distribution

fingertip-0.2.1-py3-none-any.whl (45.5 kB view details)

Uploaded Python 3

File details

Details for the file fingertip-0.2.1.tar.gz.

File metadata

  • Download URL: fingertip-0.2.1.tar.gz
  • Upload date:
  • Size: 33.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.5 CPython/3.7.6 Linux/5.5.8-100.fc30.x86_64

File hashes

Hashes for fingertip-0.2.1.tar.gz
Algorithm Hash digest
SHA256 4efb25b476f6c2f476f5cbf03d4cff965dd1970b127a98a3aa38baeaf200b89f
MD5 9fd91609b457b24327f8c7b5e3f75b6a
BLAKE2b-256 5b1f8e93a7603ce5963104016d450ebdf0da6b1a53bae5c295a961b94843c3be

See more details on using hashes here.

File details

Details for the file fingertip-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: fingertip-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 45.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.5 CPython/3.7.6 Linux/5.5.8-100.fc30.x86_64

File hashes

Hashes for fingertip-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 56bc49c427744298ca69934141654d3718ea6bde27bd3c8d9f037de15c7d6044
MD5 851e7d491fc36f3a65640c671db86043
BLAKE2b-256 20e8a57c2cc0e7f13c9eea6605fa7ce4f10dfe6a127c9fb5d3f897cd28dbb034

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page