@@ -242,45 +242,59 @@ def get_toponode(self, topology):
242242 return helpers .render_template ("toponode.j2" , data )
243243
244244 def get_interface_name_for_kind (self , ifname ):
245- """Convert a containerlab interface name to the SR OS EDA format."""
246-
247- eda_name = ifname
248-
249- m = re .match (r"^(\d+)/(\d+)/(\d+)$" , ifname )
250- if m :
251- slot , mda_num , port = m .groups ()
252- mda_letter = chr (96 + int (mda_num ))
253- eda_name = f"ethernet-{ slot } -{ mda_letter } -{ port } -1"
254- else :
255- m = re .match (r"^(\d+)/(\d+)/c(\d+)/(\d+)$" , ifname )
256- if m :
257- slot , mda_num , channel , port = m .groups ()
258- if mda_num == "1" :
259- eda_name = f"ethernet-{ slot } -{ channel } -{ port } "
260- else :
261- mda_letter = chr (96 + int (mda_num ))
262- eda_name = f"ethernet-{ slot } -{ mda_letter } -{ channel } -{ port } "
263- else :
264- m = re .match (r"^(\d+)/x(\d+)/(\d+)/(\d+)$" , ifname )
265- if m :
266- slot , xiom_id , mda_num , port = m .groups ()
267- mda_letter = chr (96 + int (mda_num ))
268- eda_name = f"ethernet-{ slot } -{ xiom_id } -{ mda_letter } -{ port } "
269- else :
270- m = re .match (r"^eth(\d+)$" , ifname )
271- if m :
272- eda_name = f"ethernet-1-a-{ m .group (1 )} -1"
273- else :
274- m = re .match (r"^e(\d+)-(\d+)$" , ifname )
275- if m :
276- slot , port = m .groups ()
277- eda_name = f"ethernet-{ slot } -a-{ port } -1"
278- else :
279- m = re .match (r"^lo(\d+)$" , ifname )
280- if m :
281- eda_name = f"loopback-{ m .group (1 )} "
282-
283- return eda_name
245+ """Convert a containerlab interface name to the SR OS EDA format.
246+
247+ Supported input formats:
248+ - "1-2-3" -> "ethernet-1-b-3"
249+ - "1-2-c3-4" -> "ethernet-1-b-3-4" (mda>1) | "1-1-c3-4" -> "ethernet-1-3-4" (mda=1)
250+ - "1-x2-1-3" -> "ethernet-1-2-1-3"
251+ - "1-x2-1-c3-1" -> "ethernet-1-2-1-3-1"
252+
253+ Args:
254+ ifname: Interface name in containerlab format
255+
256+ Returns:
257+ Interface name in SR OS EDA format
258+ """
259+
260+ def mda_to_letter (mda_num ):
261+ """Convert MDA number to letter (1->a, 2->b, etc.)"""
262+ return chr (96 + int (mda_num ))
263+
264+ # Define patterns with their transformation logic
265+ patterns = [
266+ # Pattern: "1-2-3" -> "ethernet-1-b-3"
267+ (
268+ r"^e(\d+)-(\d+)-(\d+)$" ,
269+ lambda m : f"ethernet-{ m [0 ]} -{ mda_to_letter (m [1 ])} -{ m [2 ]} " ,
270+ ),
271+ # Pattern: "1-2-c3-4" -> conditional format
272+ (
273+ r"^e(\d+)-(\d+)-c(\d+)-(\d+)$" ,
274+ lambda m : f"ethernet-{ m [0 ]} -{ m [2 ]} -{ m [3 ]} "
275+ if m [2 ] == "1"
276+ else f"ethernet-{ m [0 ]} -{ mda_to_letter (m [1 ])} -{ m [2 ]} -{ m [3 ]} " ,
277+ ),
278+ # Pattern: "1-x2-1-c3-1" -> "ethernet-1-2-1-c3-1"
279+ (
280+ r"^e(\d+)-x(\d+)-(\d+)-c(\d+)-(\d+)$" ,
281+ lambda m : f"ethernet-{ m [0 ]} -{ m [1 ]} -{ mda_to_letter (m [2 ])} -{ m [3 ]} -{ m [4 ]} " ,
282+ ),
283+ # Pattern: "1-x2-1-3" -> "ethernet-1-2-1-3"
284+ (
285+ r"^e(\d+)-x(\d+)-(\d+)-(\d+)$" ,
286+ lambda m : f"ethernet-{ m [0 ]} -{ m [1 ]} -{ mda_to_letter (m [2 ])} -{ m [3 ]} " ,
287+ ),
288+ ]
289+
290+ # Try each pattern
291+ for pattern , transformer in patterns :
292+ match = re .match (pattern , ifname )
293+ if match :
294+ return transformer (match .groups ())
295+
296+ # Return "bollocks" if no pattern matches
297+ return "Bollocks"
284298
285299 def get_topolink_interface_name (self , topology , ifname ):
286300 """
0 commit comments