Skip to main content

Python wrapper around GNS3 Server API v2 and v3

Project description

gns3fy-next

Tests Code style: black codecov Total alerts Language grade: Python pypi versions

Python wrapper around GNS3 Server API. Supports GNS3 Server API v2 and v3.

Features

  • Support for GNS3 Server API v2 and v3
  • JWT-based authentication for v3 API (automatic token management)
  • Project locking operations (v3 API)
  • Create, update, delete projects, nodes, links, and drawings
  • Snapshot management
  • Template management
  • File operations on nodes and projects

Its main objective is to interact with the GNS3 server in a programatic way, so it can be integrated with the likes of Ansible, docker and scripts. Ideal for network CI/CD pipeline tooling.

Documentation

Check out the Documentation to explore use cases and the API Reference

Use cases

Here are some examples where gns3fy is used in a programmatic way:

Install

pip install gns3fy-next

Development version

Use poetry to install the package when cloning it.

How it works

You can start the library and use the Gns3Connector object and the Project object.

For example:

>>> import gns3fy_next
>>> from tabulate import tabulate

# Define the server object to establish the connection
>>> gns3_server = gns3fy_next.Gns3Connector("http://<server address>:3080")

# Show the available projects on the server
>>> print(
        tabulate(
            gns3_server.projects_summary(is_print=False),
            headers=["Project Name", "Project ID", "Total Nodes", "Total Links", "Status"],
        )
    )
"""
Project Name    Project ID                              Total Nodes    Total Links  Status
--------------  ------------------------------------  -------------  -------------  --------
test2           c9dc56bf-37b9-453b-8f95-2845ce8908e3             10              9  opened
API_TEST        4b21dfb3-675a-4efa-8613-2f7fb32e76fe              6              4  opened
mpls-bgpv2      f5de5917-0ac5-4850-82b1-1d7e3c777fa1             30             40  closed
"""

# Define the lab you want to load and assign the server connector
>>> lab = gns3fy_next.Project(name="API_TEST", connector=gns3_server)

# Retrieve its information and display
>>> lab.get()
>>> print(lab)
"Project(project_id='4b21dfb3-675a-4efa-8613-2f7fb32e76fe', name='API_TEST', status='opened', ...)"

# Access the project attributes
>>> print(f"Name: {lab.name} -- Status: {lab.status} -- Is auto_closed?: {lab.auto_close}")
"Name: API_TEST -- Status: closed -- Is auto_closed?: False"

# Open the project
>>> lab.open()
>>> lab.status
opened

# Verify the stats
>>> lab.stats
{'drawings': 0, 'links': 4, 'nodes': 6, 'snapshots': 0}

# List the names and status of all the nodes in the project
>>> for node in lab.nodes:
...    print(f"Node: {node.name} -- Node Type: {node.node_type} -- Status: {node.status}")

"Node: Ethernetswitch-1 -- Node Type: ethernet_switch -- Status: started"
...

Take a look at the API documentation for complete information about the attributes retrieved.

Usage of Node and Link objects

You have access to the Node and Link objects as well, this gives you the ability to start, stop, suspend the individual element in a GNS3 project.

>>> from gns3fy_next import Node, Link, Gns3Connector

>>> PROJECT_ID = "<some project id>"
>>> server = Gns3Connector("http://<server address>:3080")

>>> alpine1 = Node(project_id=PROJECT_ID, name="alpine-1", connector=server)

>>> alpine1.get()
>>> print(alpine1)
"Node(name='alpine-1', node_type='docker', node_directory= ...)"

# And you can access the attributes the same way as the project
>>> print(f"Name: {alpine1.name} -- Status: {alpine1.status} -- Console: {alpine1.console}")
"Name: alpine-1 -- Status: started -- Console: 5005"

# Stop the node and start (you can just restart it as well)
>>> alpine1.stop()
>>> alpine1.status
stopped

>>> alpine1.start()
>>> alpine1.status
started

# You can also see the Link objects assigned to this node
>>> alpine1.links
[Link(link_id='4d9f1235-7fd1-466b-ad26-0b4b08beb778', link_type='ethernet', ...)]

# And in the same way you can interact with a Link object
>>> link1 = alpine1.links[0]
>>> print(f"Link Type: {link1.link_type} -- Capturing?: {link1.capturing} -- Endpoints: {link1.nodes}")
"Link Type: ethernet -- Capturing?: False -- Endpoints: [{'adapter_number': 2, ...}]"

Useful functions

You also have some commodity methods like the nodes_summary and links_summary, that if used with a library like tabulate you can see the following:

>>> from tabulate import tabulate

>>> nodes_summary = lab.nodes_summary(is_print=False)

>>> print(
...     tabulate(nodes_summary, headers=["Node", "Status", "Console Port", "ID"])
... )
"""
Node              Status      Console Port  ID
----------------  --------  --------------  ------------------------------------
Ethernetswitch-1  started             5000  da28e1c0-9465-4f7c-b42c-49b2f4e1c64d
IOU1              started             5001  de23a89a-aa1f-446a-a950-31d4bf98653c
IOU2              started             5002  0d10d697-ef8d-40af-a4f3-fafe71f5458b
vEOS-4.21.5F-1    started             5003  8283b923-df0e-4bc1-8199-be6fea40f500
alpine-1          started             5005  ef503c45-e998-499d-88fc-2765614b313e
Cloud-1           started                   cde85a31-c97f-4551-9596-a3ed12c08498
"""
>>> links_summary = lab.links_summary(is_print=False)
>>> print(
...     tabulate(links_summary, headers=["Node A", "Port A", "Node B", "Port B"])
... )
"""
Node A          Port A       Node B            Port B
--------------  -----------  ----------------  -----------
IOU1            Ethernet1/0  IOU2              Ethernet1/0
vEOS-4.21.5F-1  Management1  Ethernetswitch-1  Ethernet0
vEOS-4.21.5F-1  Ethernet1    alpine-1          eth0
Cloud-1         eth1         Ethernetswitch-1  Ethernet7
"""

GNS3 API v3 Support

For GNS3 servers using API v3, you can use JWT-based authentication:

>>> from gns3fy_next import Gns3Connector, Project

# Connect to GNS3 v3 server with JWT authentication
>>> server = Gns3Connector(
...     url="http://<server address>:3080",
...     user="your_username",
...     cred="your_password",
...     api_version=3
... )

# Create or open a project
>>> lab = Project(name="my_project", connector=server)
>>> lab.get()

# Lock the project (v3 only)
>>> lab.lock_project()
>>> lab.get_locked()
True

# Unlock the project
>>> lab.unlock_project()
>>> lab.get_locked()
False

# Create a drawing
>>> from gns3fy_next.drawing_utils import generate_rectangle_svg
>>> svg_content = generate_rectangle_svg(x=10, y=10, width=200, height=100)
>>> lab.create_drawing(svg=svg_content, x=100, y=100, z=0)

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

gns3fy_next-1.0.0.tar.gz (22.3 kB view details)

Uploaded Source

Built Distribution

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

gns3fy_next-1.0.0-py3-none-any.whl (20.3 kB view details)

Uploaded Python 3

File details

Details for the file gns3fy_next-1.0.0.tar.gz.

File metadata

  • Download URL: gns3fy_next-1.0.0.tar.gz
  • Upload date:
  • Size: 22.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gns3fy_next-1.0.0.tar.gz
Algorithm Hash digest
SHA256 5543977975a94580838e8f0917c3c8efd37cbc9c7bb8bd6f0e38497cf4a67f5e
MD5 072f59e816332db58d3ad1d5183a6a8c
BLAKE2b-256 135c684969578b9c4964660d794df3bb491963726c391a408d901f7cbaefa1d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for gns3fy_next-1.0.0.tar.gz:

Publisher: publish.yml on yueguobin/gns3fy-next

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

File details

Details for the file gns3fy_next-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: gns3fy_next-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 20.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gns3fy_next-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 855b5ceaaa06e7e03bb7b285488a0902d479c65d2bfae7e652d6e324a2617b99
MD5 12d427c84ba5fec257b73edf5a50564a
BLAKE2b-256 7e8b402981d85a545464235350c5d1b788b010fcb29460c648ad25d7a32e5bcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for gns3fy_next-1.0.0-py3-none-any.whl:

Publisher: publish.yml on yueguobin/gns3fy-next

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

Supported by

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