Skip to main content

alembic-adapter-sdk (python)

a small, dependency-free sdk for writing alembic external adapters in python.

network engineering lives in python, so adapters should be writable there too. alembic delegates backend i/o to external adapters: standalone programs the alembic host spawns as subprocesses, exchanging one json request and one json response over stdin/stdout. this sdk handles that protocol so you only write the backend logic.

the import package is alembic_adapter. (the pypi distribution is alembic-adapter-sdk; the bare name alembic belongs to sqlalchemy's migration tool and is unrelated.)

install

pip install alembic-adapter-sdk

or, from a checkout:

pip install -e .

the sdk has no runtime dependencies; it speaks json with the stdlib.

writing an adapter

subclass Adapter, implement the methods your backend needs, and call run:

from alembic_adapter import Adapter, ApplyReport, AppliedOp, Create, run


class MyAdapter(Adapter):
    def setup(self, config):
        # `config` is the parsed `setup:` block from the backend config.
        self.host = (config or {}).get("host", "http://localhost:8080")

    def read(self, schema, types, state):
        # observe backend state -> list[ExternalObject]; the engine diffs it
        # against the desired inventory to build a plan. emit-only adapters
        # return [] (the default).
        return []

    def write(self, schema, ops, state):
        # apply create/update/delete ops, then report what was applied.
        report = ApplyReport()
        for op in ops:
            if isinstance(op, Create):
                ...  # create op.desired on the backend
            report.applied.append(AppliedOp(uid=op.uid, type_name=op.type_name))
        return report


if __name__ == "__main__":
    run(MyAdapter())

run reads one request from stdin, dispatches it, and writes a newline-terminated json response to stdout. any exception your adapter raises is turned into a well-formed {"ok": false, "error": ...} response.

see examples/example_adapter.py for a complete, copyable starting point.

the protocol

every request carries version (currently 1) and a method. the sdk parses the payload into typed objects and serializes your results back:

method you receive you return
read schema, types, state list[ExternalObject]
write schema, ops, state ApplyReport
ensure_schema schema ProvisionReport
preview_schema schema ProvisionReport or None
capabilities nothing Capabilities

preview_schema is called at plan time to show what ensure_schema would provision without writing; return None (the default) if your adapter cannot preview.

capabilities reports the adapter's role: adapter (read+write, the default), emitter (write-only), or observer (read-only), so the host can reject import/apply up front instead of calling into a side that does nothing.

setup is the setup: block from the backend config (parsed json, usually a dict); Adapter.setup is called once before each request.

the model mirrors alembic's ir:

  • Op is Create, Update, or Delete (dispatch with isinstance). Create and Update carry the full desired Object; Update also carries changes and backend_id; Delete carries key and backend_id.
  • Object has uid, type_name, key, and attrs.
  • State.backend_id(type_name, uid) looks up the engine's existing backend id for an object, so renames stay stable.
  • Schema parses into TypeSchema / FieldSchema / FieldType, so schema-driven adapters can, for example, find reference fields via field.type.kind == "ref" and field.type.target.

for the full request/response shapes, see alembic's docs/external-adapters.md.

wiring into alembic

point a backend config at your program (see examples/backend.yaml):

backend: external
command: python3
args: ["examples/example_adapter.py"]
setup:
  host: http://localhost:8080
alembic plan  --backend external --backend-config examples/backend.yaml \
  -f inventory.yaml -o plan.json
alembic apply --backend external --backend-config examples/backend.yaml \
  -p plan.json

you can also debug the protocol by hand by piping a request into your adapter:

echo '{"version":1,"setup":{},"method":"read","schema":{"types":{}},"types":[],"state":{"mappings":{}}}' \
  | python3 examples/example_adapter.py

develop

pip install -e ".[dev]"

# tests
PYTHONPATH=src python -m unittest discover -s tests

# tests with the coverage gate (fails under 100%, matching ci)
coverage run -m unittest discover -s tests
coverage report

ruff check
ruff format --check

license

Apache-2.0

Download files

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

Source Distribution

alembic_adapter_sdk-0.3.0.tar.gz (20.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

alembic_adapter_sdk-0.3.0-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

Details for the file alembic_adapter_sdk-0.3.0.tar.gz.

File metadata

  • Download URL: alembic_adapter_sdk-0.3.0.tar.gz
  • Upload date:
  • Size: 20.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for alembic_adapter_sdk-0.3.0.tar.gz
Algorithm Hash digest
SHA256 285d8ed93e6710c3f6bac6c1ffb874f7949d8d12b1a2d059cc919ea784c0d9ca
MD5 4b5423c9859aed1385a64930347c1bbc
BLAKE2b-256 356f94ce1158d45c288f733fa58f45373705c2666aedf8fe98cc8c6d8996bb6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for alembic_adapter_sdk-0.3.0.tar.gz:

Publisher: publish.yml on cyberwitchery/alembic-adapter-sdk-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alembic_adapter_sdk-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for alembic_adapter_sdk-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e03dbdd4591860506f7725150944024c9581da3c1cd007acfda8aa049e54ed97
MD5 61441ee64f8351c4016e2dc79e49c8ce
BLAKE2b-256 33d72cc39907249c0f7276725c23638db61125e537204ec8a60487f23360d947

See more details on using hashes here.

Provenance

The following attestation bundles were made for alembic_adapter_sdk-0.3.0-py3-none-any.whl:

Publisher: publish.yml on cyberwitchery/alembic-adapter-sdk-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.1

2 files

This release

0.3.0 This release

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page