Skip to main content

P4Runtime Client Library

Project description

Finsy P4Runtime Controller Library

pypi ci codecov docs

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

Requirements

Finsy requires Python 3.10 or later.

P4Runtime Scripts

With Finsy, you can write a Python script that reads/writes P4Runtime entities for a single switch.

Here is a complete example that retrieves the P4Info from a switch:

import asyncio
import finsy as fy

async def main():
    async with fy.Switch("sw1", "127.0.0.1:50001") as sw1:
        # Print out a description of the switch's P4Info, if one is configured.
        print(sw1.p4info)

asyncio.run(main())

Here is another example that prints out all non-default table entries.

import asyncio
import finsy as fy

async def main():
    async with fy.Switch("sw1", "127.0.0.1:50001") as sw1:
        # Do a wildcard read for table entries.
        async for entry in sw1.read(fy.P4TableEntry()):
            print(entry)

asyncio.run(main())

P4Runtime Controller

You can also write a P4Runtime controller that manages multiple switches independently.

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())

Your ready_handler can spawn concurrent tasks with the Switch.create_task method. Tasks created this way will have their lifetimes managed by the switch object.

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.12.0.tar.gz (164.0 kB view details)

Uploaded Source

Built Distribution

finsy-0.12.0-py3-none-any.whl (204.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for finsy-0.12.0.tar.gz
Algorithm Hash digest
SHA256 659ce6157ee91b4646712b8075ac98081bab13b93e69125310da57fb4577112b
MD5 470f77b92bf00cfec2bc485484cf04f2
BLAKE2b-256 ec3cf2b6c813b0c117ec452292abfb7243afced974083e95e8b766779811a5b3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: finsy-0.12.0-py3-none-any.whl
  • Upload date:
  • Size: 204.6 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.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fb884a0c712a2bf6ae725ff93579ca8e30c72534367c6abd58724232cdb79a5d
MD5 d844bc85fc2866c7ad5f3a9aa2941935
BLAKE2b-256 3388e98253c89318116fc76609336971d41fb79f4d137465efedeaa612d135c9

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