From 94dae86c6ffabe1fa89dcca6978fb8c7aa2c7898 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Wed, 26 Jun 2024 17:22:11 -0400 Subject: [PATCH 1/7] pass vlan for mirror port --- CHANGELOG.md | 1 + fabrictestbed_extensions/fablib/interface.py | 7 ++++--- fabrictestbed_extensions/fablib/network_service.py | 5 ++++- pyproject.toml | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30153692..724aad53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # Unreleased ### Fixed +- Port Mirroring with Basic NICs (Issue [#343](https://github.com/fabric-testbed/fabrictestbed-extensions/issues/343)) - P4 support (Issue [#340](https://github.com/fabric-testbed/fabrictestbed-extensions/issues/340)) - ERO Support (Issue [#338](https://github.com/fabric-testbed/fabrictestbed-extensions/issues/338)) - List hosts (Issue [#331](https://github.com/fabric-testbed/fabrictestbed-extensions/issues/331)) diff --git a/fabrictestbed_extensions/fablib/interface.py b/fabrictestbed_extensions/fablib/interface.py index 5227d5c8..832c6d15 100644 --- a/fabrictestbed_extensions/fablib/interface.py +++ b/fabrictestbed_extensions/fablib/interface.py @@ -994,10 +994,11 @@ def config(self): # manual mode... do nothing pass - def add_mirror(self, port_name: str, name: str = "mirror"): + def add_mirror(self, port_name: str, name: str = "mirror", vlan: str = None): self.get_slice().get_fim_topology().add_port_mirror_service( name=name, from_interface_name=port_name, + from_interface_vlan=vlan, to_interface=self.get_fim_interface(), ) @@ -1033,7 +1034,7 @@ def set_subnet(self, ipv4_subnet: str = None, ipv6_subnet: str = None): ipaddress.ip_network(ipv6_subnet, strict=False) labels = Labels.update(labels, ipv6_subnet=ipv6_subnet) - self.get_fim().set_property('labels', labels) + self.get_fim().set_property("labels", labels) except Exception as e: logging.error(f"Failed to set the ip subnet e: {e}") raise e @@ -1062,4 +1063,4 @@ def get_peer_bgp_key(self): def get_peer_account_id(self): if self.get_fim() and self.get_fim().peer_labels: - return self.get_fim().peer_labels.account_id \ No newline at end of file + return self.get_fim().peer_labels.account_id diff --git a/fabrictestbed_extensions/fablib/network_service.py b/fabrictestbed_extensions/fablib/network_service.py index ed4b2128..20e5bb28 100644 --- a/fabrictestbed_extensions/fablib/network_service.py +++ b/fabrictestbed_extensions/fablib/network_service.py @@ -1064,7 +1064,10 @@ def get_interfaces(self) -> List[Interface]: except: logging.warning(f"interface not found: {interface.name}") from fabrictestbed_extensions.fablib.interface import Interface - self.interfaces.append(Interface(fim_interface=interface, node=self)) + + self.interfaces.append( + Interface(fim_interface=interface, node=self) + ) return self.interfaces diff --git a/pyproject.toml b/pyproject.toml index 1ef8bfc4..971ef908 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ "ipyleaflet", "ipycytoscape", "tabulate", - "fabrictestbed==1.7.0b9", + "fabrictestbed==1.7.0b10", "paramiko", "jinja2>=3.0.0", "pandas", From 02b7de657d81d2be376bf9334bb3214748b64238 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Wed, 26 Jun 2024 19:40:14 -0400 Subject: [PATCH 2/7] fix vlan --- fabrictestbed_extensions/fablib/interface.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fabrictestbed_extensions/fablib/interface.py b/fabrictestbed_extensions/fablib/interface.py index 832c6d15..960ad6c0 100644 --- a/fabrictestbed_extensions/fablib/interface.py +++ b/fabrictestbed_extensions/fablib/interface.py @@ -619,6 +619,8 @@ def get_vlan(self) -> str: """ try: vlan = self.get_fim_interface().get_property(pname="labels").vlan + if not vlan: + vlan = self.get_fim_interface().get_property(pname="label_allocations").vlan except: vlan = None return vlan From 2b39b91c1e5a087043137ee6e4a2673581732c03 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Wed, 26 Jun 2024 19:53:15 -0400 Subject: [PATCH 3/7] fetch port peer vlan --- fabrictestbed_extensions/fablib/interface.py | 28 +++++++++----------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/fabrictestbed_extensions/fablib/interface.py b/fabrictestbed_extensions/fablib/interface.py index 960ad6c0..a5a52592 100644 --- a/fabrictestbed_extensions/fablib/interface.py +++ b/fabrictestbed_extensions/fablib/interface.py @@ -341,6 +341,19 @@ def get_peer_port_name(self) -> str or None: else: return None + def get_peer_port_vlan(self) -> str: + """ + Returns the VLAN associated with the interface. + For shared NICs extracts it from label_allocations. + + :return VLAN to be used for Port Mirroring + """ + vlan = self.get_vlan() + if not vlan: + label_allocations = self.get_fim_interface().get_property(pname="label_allocations") + if label_allocations: + return label_allocations.vlan + def get_device_name(self) -> str: """ Gets a name of the device name on the node @@ -619,25 +632,10 @@ def get_vlan(self) -> str: """ try: vlan = self.get_fim_interface().get_property(pname="labels").vlan - if not vlan: - vlan = self.get_fim_interface().get_property(pname="label_allocations").vlan except: vlan = None return vlan - def get_bandwidth(self) -> int: - """ - Gets the FABRIC bandwidth of an interface. - - :return: VLAN - :rtype: String - """ - try: - bw = self.get_fim_interface().get_property(pname="capacities").bw - except: - bw = None - return bw - def get_reservation_id(self) -> str or None: try: # TODO THIS DOESNT WORK. From 06fb3b2bdf6e3165edd6d4c7885fd23cc16623f3 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Wed, 26 Jun 2024 19:58:05 -0400 Subject: [PATCH 4/7] pass vlan when adding pm service --- fabrictestbed_extensions/fablib/network_service.py | 2 ++ fabrictestbed_extensions/fablib/slice.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/fabrictestbed_extensions/fablib/network_service.py b/fabrictestbed_extensions/fablib/network_service.py index 20e5bb28..ce061bd2 100644 --- a/fabrictestbed_extensions/fablib/network_service.py +++ b/fabrictestbed_extensions/fablib/network_service.py @@ -290,6 +290,7 @@ def new_portmirror_service( slice: Slice = None, name: str = None, mirror_interface_name: str = None, + mirror_interface_vlan: str = None, receive_interface: Interface or None = None, mirror_direction: str = "both", ) -> NetworkService: @@ -344,6 +345,7 @@ def new_portmirror_service( fim_network_service = slice.topology.add_port_mirror_service( name=name, from_interface_name=mirror_interface_name, + from_interface_vlan=mirror_interface_vlan, to_interface=receive_interface.fim_interface, direction=direction, ) diff --git a/fabrictestbed_extensions/fablib/slice.py b/fabrictestbed_extensions/fablib/slice.py index 52865b64..07357ce3 100644 --- a/fabrictestbed_extensions/fablib/slice.py +++ b/fabrictestbed_extensions/fablib/slice.py @@ -909,6 +909,7 @@ def add_port_mirror_service( name: str, mirror_interface_name: str, receive_interface: Interface or None = None, + mirror_interface_vlan: str = None, mirror_direction: str = "both", ) -> NetworkService: """ @@ -921,6 +922,7 @@ def add_port_mirror_service( :param name: Name of the service :param mirror_interface_name: Name of the interface on the dataplane switch to mirror + :param mirror_interface_vlan: Vlan of the interface :param receive_interface: Interface in the topology belonging to a SmartNIC component :param mirror_direction: String 'rx', 'tx' or 'both' @@ -932,6 +934,7 @@ def add_port_mirror_service( slice=self, name=name, mirror_interface_name=mirror_interface_name, + mirror_interface_vlan=mirror_interface_vlan, receive_interface=receive_interface, mirror_direction=mirror_direction, ) From 705bd5c04dc02cc75d43d01d953b99f2e62ff152 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Wed, 26 Jun 2024 20:07:48 -0400 Subject: [PATCH 5/7] up version and black --- fabrictestbed_extensions/fablib/interface.py | 4 +++- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fabrictestbed_extensions/fablib/interface.py b/fabrictestbed_extensions/fablib/interface.py index a5a52592..ebb02a5b 100644 --- a/fabrictestbed_extensions/fablib/interface.py +++ b/fabrictestbed_extensions/fablib/interface.py @@ -350,7 +350,9 @@ def get_peer_port_vlan(self) -> str: """ vlan = self.get_vlan() if not vlan: - label_allocations = self.get_fim_interface().get_property(pname="label_allocations") + label_allocations = self.get_fim_interface().get_property( + pname="label_allocations" + ) if label_allocations: return label_allocations.vlan diff --git a/pyproject.toml b/pyproject.toml index 971ef908..f8d6b00f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ "ipyleaflet", "ipycytoscape", "tabulate", - "fabrictestbed==1.7.0b10", + "fabrictestbed==1.7.0b11", "paramiko", "jinja2>=3.0.0", "pandas", From ca2ed8aeb24273e42770f64ebfddd23907fd1f70 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Wed, 26 Jun 2024 20:33:02 -0400 Subject: [PATCH 6/7] add white space to trigger docs workflow --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bb4346fc..10793291 100644 --- a/README.md +++ b/README.md @@ -89,3 +89,4 @@ help FABlib, please review the [guidelines] first. [configuration]: https://fabric-fablib.readthedocs.io/en/latest/#configuring-fablib [guidelines]: ./CONTRIBUTING.md + From e1f0857f520e6627299c83c9bff5591b173bb5c9 Mon Sep 17 00:00:00 2001 From: Komal Thareja Date: Thu, 27 Jun 2024 09:05:19 -0400 Subject: [PATCH 7/7] updated docstring --- fabrictestbed_extensions/fablib/interface.py | 48 ++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/fabrictestbed_extensions/fablib/interface.py b/fabrictestbed_extensions/fablib/interface.py index ebb02a5b..12a051b2 100644 --- a/fabrictestbed_extensions/fablib/interface.py +++ b/fabrictestbed_extensions/fablib/interface.py @@ -346,7 +346,8 @@ def get_peer_port_vlan(self) -> str: Returns the VLAN associated with the interface. For shared NICs extracts it from label_allocations. - :return VLAN to be used for Port Mirroring + :return: VLAN to be used for Port Mirroring + :rtype: String """ vlan = self.get_vlan() if not vlan: @@ -572,8 +573,8 @@ def set_vlan(self, vlan: Any = None): """ Set the VLAN on the FABRIC request. - :param addr: vlan - :type addr: String or int + :param vlan: vlan + :type vlan: String or int """ if vlan: vlan = str(vlan) @@ -997,6 +998,17 @@ def config(self): pass def add_mirror(self, port_name: str, name: str = "mirror", vlan: str = None): + """ + Add Port Mirror Service + + :param port_name: Mirror Port Name + :type port_name: String + :param vlan: Mirror Port vlan + :type vlan: String + :param name: Name of the Port Mirror service + :type name: String + + """ self.get_slice().get_fim_topology().add_port_mirror_service( name=name, from_interface_name=port_name, @@ -1042,6 +1054,12 @@ def set_subnet(self, ipv4_subnet: str = None, ipv6_subnet: str = None): raise e def get_subnet(self): + """ + Get Subnet associated with the interface + + :return: ipv4/ipv6 subnet associated with the interface + :rtype: String + """ if self.get_fim() and self.get_fim().labels: if self.get_fim().labels.ipv4_subnet: return self.get_fim().labels.ipv4_subnet @@ -1049,6 +1067,12 @@ def get_subnet(self): return self.get_fim().labels.ipv6_subnet def get_peer_subnet(self): + """ + Get Peer Subnet associated with the interface + + :return: peer ipv4/ipv6 subnet associated with the interface + :rtype: String + """ if self.get_fim() and self.get_fim().peer_labels: if self.get_fim().peer_labels.ipv4_subnet: return self.get_fim().peer_labels.ipv4_subnet @@ -1056,13 +1080,31 @@ def get_peer_subnet(self): return self.get_fim().peer_labels.ipv6_subnet def get_peer_asn(self): + """ + Get Peer ASN; Set only for Peered Interface using L3Peering via AL2S + + :return: peer asn + :rtype: String + """ if self.get_fim() and self.get_fim().peer_labels: return self.get_fim().peer_labels.asn def get_peer_bgp_key(self): + """ + Get Peer BGP Key; Set only for Peered Interface using L3Peering via AL2S + + :return: peer BGP Key + :rtype: String + """ if self.get_fim() and self.get_fim().peer_labels: return self.get_fim().peer_labels.bgp_key def get_peer_account_id(self): + """ + Get Peer Account Id associated with the interface + + :return: peer account id associated with the interface (Used when interface is peered to AWS via AL2S) + :rtype: String + """ if self.get_fim() and self.get_fim().peer_labels: return self.get_fim().peer_labels.account_id