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

Uploaded Source

Built Distribution

finsy-0.13.0-py3-none-any.whl (209.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for finsy-0.13.0.tar.gz
Algorithm Hash digest
SHA256 511fa4b43e6d592aaca99ebc49d6b91f83a00840eb487cea2cede5eae829da6a
MD5 577e22073d327b46e4191f909e7a8f43
BLAKE2b-256 e68a8954bb96fca088bdc75fa023ff9230bb5a2fbb311297dee9c9c2285ef722

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for finsy-0.13.0-py3-none-any.whl
Algorithm Hash digest
SHA256 18aee0f4a9278f83f558a61968db443f1512b9e616b170d25ea033fbbbd435a4
MD5 96d15a47ed45f2a686e16b588ff5feef
BLAKE2b-256 508e5b9f24dad35d6d136e5dc03c166e3da1904ddf8ecd0468d641ce21986d50

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