-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #296 from fabric-testbed/rel1.7
Rel1.7 - updates
- Loading branch information
Showing
8 changed files
with
1,177 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
214 changes: 214 additions & 0 deletions
214
.../fablib_api/create_l2network_wide_area_ero_auto/create_l2network_wide_area_ero_auto.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,214 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"# Create a Point to Point (Layer 2) Network with Explicit Route Options (ERO)\n", | ||
"\n", | ||
"This notebook shows how to create an isolated Point 2 Point Layer2 Ethernet, specify Explicity Route Options (ERO) to control Quality of Service and connect compute nodes to it and use FABlib's automatic configuration functionality." | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Import the FABlib Library\n" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"from ipaddress import ip_address, IPv4Address, IPv6Address, IPv4Network, IPv6Network\n", | ||
"import ipaddress\n", | ||
"\n", | ||
"from fabrictestbed_extensions.fablib.fablib import FablibManager as fablib_manager\n", | ||
"\n", | ||
"fablib = fablib_manager()\n", | ||
" \n", | ||
"fablib.show_config();" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Create the Experiment Slice\n", | ||
"\n", | ||
"The following script sets up two nodes, each with dedicated NICs connected to two isolated WAN Ethernets, with and without Explicit Routes.\n", | ||
"\n", | ||
"Two nodes are instantiated, each with a NIC component added. This script employs components modeled after NIC_ConnectX_6, representing a 100 Gpbs Mellanox ConnectX-6 PCI device. When using dedicated PCI devices, the entire physical device is allocated to one node, accessed through PCI passthrough. Using the `get_interfaces()` method on a component retrieves a list of interfaces. Many dedicated NIC components may have multiple ports, with either port connectable to the network.\n", | ||
"\n", | ||
"\n", | ||
"NIC component model options include:\n", | ||
"- NIC_ConnectX_5: 25 Gbps Dedicated Mellanox ConnectX-5 PCI Device (2 Ports)\n", | ||
"- NIC_ConnectX_6: 100 Gbps Dedicated Mellanox ConnectX-6 PCI Device (2 Ports)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"slice_name = 'MySlice-ero'\n", | ||
"[site1, site2, site3] = fablib.get_random_sites(count=3)\n", | ||
"print(f\"Sites: {site1}, {site2}, {site3}\")\n", | ||
"\n", | ||
"node1_name = 'Node1'\n", | ||
"node2_name = 'Node2'\n", | ||
"net1_name = 'net-with-ero'\n", | ||
"net2_name = 'net'" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": { | ||
"tags": [] | ||
}, | ||
"outputs": [], | ||
"source": [ | ||
"\n", | ||
"#Create Slice\n", | ||
"slice = fablib.new_slice(name=slice_name)\n", | ||
"\n", | ||
"# Network\n", | ||
"net1 = slice.add_l2network(name=net1_name, subnet=IPv4Network(\"192.168.1.0/24\"))\n", | ||
"\n", | ||
"net2 = slice.add_l2network(name=net2_name, subnet=IPv4Network(\"192.168.2.0/24\"))\n", | ||
"\n", | ||
"# Node1\n", | ||
"node1 = slice.add_node(name=node1_name, site=site1)\n", | ||
"n1_nic1 = node1.add_component(model='NIC_ConnectX_5', name='nic1')\n", | ||
"n1_nic1.get_interfaces()[0].set_mode('auto')\n", | ||
"n1_nic1.get_interfaces()[0].set_vlan('100')\n", | ||
"n1_nic1.get_interfaces()[1].set_mode('auto')\n", | ||
"n1_nic1.get_interfaces()[1].set_vlan('200')\n", | ||
"\n", | ||
"net1.add_interface(n1_nic1.get_interfaces()[0])\n", | ||
"\n", | ||
"net2.add_interface(n1_nic1.get_interfaces()[1])\n", | ||
"\n", | ||
"# Node2\n", | ||
"node2 = slice.add_node(name=node2_name, site=site2)\n", | ||
"n2_nic1 = node2.add_component(model='NIC_ConnectX_5', name='nic1')\n", | ||
"\n", | ||
"n2_nic1.get_interfaces()[0].set_mode('auto')\n", | ||
"n2_nic1.get_interfaces()[0].set_vlan('100')\n", | ||
"n2_nic1.get_interfaces()[1].set_mode('auto')\n", | ||
"n2_nic1.get_interfaces()[1].set_vlan('200')\n", | ||
"\n", | ||
"net1.add_interface(n2_nic1.get_interfaces()[0])\n", | ||
"\n", | ||
"net2.add_interface(n2_nic1.get_interfaces()[1])\n", | ||
"\n", | ||
"# Set Explicit Route Options for Network1\n", | ||
"net1.set_l2_route_hops(hops=[site3])\n", | ||
"\n", | ||
"\n", | ||
"#Submit Slice Request\n", | ||
"slice.submit()" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Run the Experiment\n", | ||
"We demonstrate the variance in delay between two networks. It's important to note that the network utilizing ERO exhibits greater ping delay compared to the network without ERO." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"# Get Slice and Nodes\n", | ||
"slice = fablib.get_slice(slice_name)\n", | ||
"\n", | ||
"node1 = slice.get_node(name=node1_name) \n", | ||
"node2 = slice.get_node(name=node2_name) " | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"### Ping on the Network with Explicit Routes" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"node2_net1_addr = node2.get_interface(network_name=net1_name).get_ip_addr()\n", | ||
"\n", | ||
"stdout, stderr = node1.execute(f'ping -c 5 {node2_net1_addr}')" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"### Ping on the Network without Explicit Routes" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"node2_net2_addr = node2.get_interface(network_name=net2_name).get_ip_addr()\n", | ||
"\n", | ||
"stdout, stderr = node1.execute(f'ping -c 5 {node2_net2_addr}')" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Delete the Slice\n", | ||
"\n", | ||
"Please delete your slice when you are done with your experiment." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"slice.delete()" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": "Python 3 (ipykernel)", | ||
"language": "python", | ||
"name": "python3" | ||
}, | ||
"language_info": { | ||
"codemirror_mode": { | ||
"name": "ipython", | ||
"version": 3 | ||
}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.11.8" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 4 | ||
} |
Oops, something went wrong.