Skip to main content

P4Runtime Client Library

Project description

🐟 Finsy P4Runtime Python Library

pypi ci codecov docs

Finsy is a P4Runtime controller library written in Python using asyncio. Finsy includes support for gNMI.

import asyncio
import finsy as fy

async def main():
    async with fy.Switch("sw1", "127.0.0.1:50001") as sw1:
        print(sw1.p4info)

asyncio.run(main())

Requirements

Finsy requires Python 3.10 or later.

P4Runtime Controller

With Finsy, you can write a P4Runtime controller that manages multiple switches.

Each switch is managed by an async ready_handler function. Your ready_handler function can read or update various P4Runtime entities in the switch. It can also create tasks to listen for packets or digests.

When you write P4Runtime updates to the switch, you use a unary operator (+, -, ~) to specify the operation: INSERT (+), DELETE (-) or MODIFY (~).

async def ready_handler(sw):
    await sw.delete_all()
    await sw.write(
        [
            # Insert multicast group with ports 1, 2, 3 and CONTROLLER.
            +fy.P4MulticastGroupEntry(1, replicas=[1, 2, 3, 255]),
            # Modify default table entry to flood all unmatched packets.
            ~fy.P4TableEntry(
                "ipv4",
                action=fy.P4TableAction("flood"),
                is_default_action=True,
            ),
        ]
    )

    async for packet in sw.read_packets():
        print(f"{sw.name}: {packet}")

Use the SwitchOptions class to specify each switch's settings, including the p4info/p4blob and ready_handler. Use the Controller class to drive multiple switch connections. Each switch will call back into your ready_handler function after the P4Runtime connection is established.

from pathlib import Path

options = fy.SwitchOptions(
    p4info=Path("hello.p4info.txt"),
    p4blob=Path("hello.json"),
    ready_handler=ready_handler,
)

controller = fy.Controller([
    fy.Switch("sw1", "127.0.0.1:50001", options),
    fy.Switch("sw2", "127.0.0.1:50002", options),
    fy.Switch("sw3", "127.0.0.1:50003", options),
])

asyncio.run(controller.run())

If the switch disconnects or its role changes to backup, the task running your ready_handler (and any tasks it spawned) will be cancelled and the ready_handler will begin again.

For more examples, see the examples directory.

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

finsy-0.11.0.tar.gz (163.3 kB view details)

Uploaded Source

Built Distribution

finsy-0.11.0-py3-none-any.whl (204.2 kB view details)

Uploaded Python 3

File details

Details for the file finsy-0.11.0.tar.gz.

File metadata

  • Download URL: finsy-0.11.0.tar.gz
  • Upload date:
  • Size: 163.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.1

File hashes

Hashes for finsy-0.11.0.tar.gz
Algorithm Hash digest
SHA256 7ff0ede1c76455dc92893d7e282eb37d95043cb64828a8190073f6ffbc301805
MD5 34329cb9d1cc525e0b0a8c356f13a08e
BLAKE2b-256 056a638dff9ecd6a10b1ad28c325c3776fec37364be57c5a3c7352849a51ae45

See more details on using hashes here.

File details

Details for the file finsy-0.11.0-py3-none-any.whl.

File metadata

  • Download URL: finsy-0.11.0-py3-none-any.whl
  • Upload date:
  • Size: 204.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.1

File hashes

Hashes for finsy-0.11.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c994155cfb716ba10830471372e836ab9c5f79c932153be2153f5728365065a0
MD5 84d7269b584fcc97c23942c4fdba7b5b
BLAKE2b-256 4d3a8fff9738e262b46c654271b0dcd0decd867839b90ab8dc3961f0b1ad771e

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