@@ -436,15 +436,23 @@ def get_interface_sliver_mapping(ifs_node_id: str, slice_graph: ABCASMPropertyGr
436
436
raise Exception (f"More than one Peer Interface Sliver found for IFS: { ifs_node_id } !" )
437
437
peer_ifs = next (iter (peer_interfaces ))
438
438
439
- peer_ns_node_name , peer_ns_id = slice_graph .get_parent (node_id = peer_ifs .node_id ,
440
- rel = ABCPropertyGraph .REL_CONNECTS ,
441
- parent = ABCPropertyGraph .CLASS_NetworkService )
439
+ if peer_ifs .get_type () == InterfaceType .SubInterface :
440
+ parent_cp_node_name , parent_cp_node_id = slice_graph .get_parent (node_id = peer_ifs .node_id ,
441
+ rel = ABCPropertyGraph .REL_CONNECTS ,
442
+ parent = ABCPropertyGraph .CLASS_ConnectionPoint )
443
+ peer_ns_node_name , peer_ns_id = slice_graph .get_parent (node_id = parent_cp_node_id ,
444
+ rel = ABCPropertyGraph .REL_CONNECTS ,
445
+ parent = ABCPropertyGraph .CLASS_NetworkService )
446
+ else :
447
+ peer_ns_node_name , peer_ns_id = slice_graph .get_parent (node_id = peer_ifs .node_id ,
448
+ rel = ABCPropertyGraph .REL_CONNECTS ,
449
+ parent = ABCPropertyGraph .CLASS_NetworkService )
442
450
443
451
component_name = None
444
452
facility = False
445
453
peer_site = None
446
454
447
- if peer_ifs .get_type () in [InterfaceType .DedicatedPort , InterfaceType .SharedPort ]:
455
+ if peer_ifs .get_type () in [InterfaceType .DedicatedPort , InterfaceType .SharedPort , InterfaceType . SubInterface ]:
448
456
component_name , component_id = slice_graph .get_parent (node_id = peer_ns_id , rel = ABCPropertyGraph .REL_HAS ,
449
457
parent = ABCPropertyGraph .CLASS_Component )
450
458
# Possibly P4 switch; parent will be a switch
@@ -467,6 +475,7 @@ def get_interface_sliver_mapping(ifs_node_id: str, slice_graph: ABCASMPropertyGr
467
475
468
476
# Peer Network Service is FABRIC L3VPN connected to a FABRIC Site
469
477
# Determine the site to which AL2S Peered Interface is connected to
478
+
470
479
for ifs in peer_ns .interface_info .interfaces .values ():
471
480
# Skip the peered interface
472
481
if ifs .node_id == peer_ifs .node_id :
@@ -600,23 +609,85 @@ def get_owners(*, bqm: ABCCBMPropertyGraph, node_id: str,
600
609
return switch , mpls_ns , requested_ns
601
610
602
611
@staticmethod
603
- def get_parent_node (* , graph_model : ABCPropertyGraph , component : Component = None , interface : Interface = None ,
612
+ def get_parent_node (* , graph_model : ABCPropertyGraph , node : Union [ Component , Interface ] ,
604
613
sliver : bool = True ) -> Tuple [Union [NodeSliver , NetworkServiceSliver , None ], str ]:
605
- node = None
606
- if component is not None :
607
- node_name , node_id = graph_model .get_parent (node_id = component .node_id , rel = ABCPropertyGraph .REL_HAS ,
608
- parent = ABCPropertyGraph .CLASS_NetworkNode )
609
- if sliver :
610
- node = graph_model .build_deep_node_sliver (node_id = node_id )
611
- elif interface is not None :
612
- node_name , node_id = graph_model .get_parent (node_id = interface .node_id , rel = ABCPropertyGraph .REL_CONNECTS ,
613
- parent = ABCPropertyGraph .CLASS_NetworkService )
614
- if sliver :
615
- node = graph_model .build_deep_ns_sliver (node_id = node_id )
616
- else :
614
+ """
615
+ Retrieve the parent node of a given component or interface in the graph model.
616
+
617
+ This method determines the parent node of a specified component or interface within the provided
618
+ property graph model. It can return either a node sliver or a network service sliver based on the
619
+ type of the input node and the `sliver` flag.
620
+
621
+ :param graph_model: The property graph model used to find parent nodes.
622
+ :type graph_model: ABCPropertyGraph
623
+
624
+ :param node: The component or interface for which to find the parent node.
625
+ :type node: Union[Component, Interface]
626
+
627
+ :param sliver: Flag indicating whether to build and return a sliver object for the parent node.
628
+ Defaults to True.
629
+ :type sliver: bool
630
+
631
+ :return: A tuple containing the parent node sliver (or network service sliver) and the parent node ID.
632
+ If no parent node is found, returns (None, None).
633
+ :rtype: Tuple[Union[NodeSliver, NetworkServiceSliver, None], str]
634
+
635
+ :raises Exception: If the `node` argument is None or is neither a Component nor an Interface.
636
+
637
+ Example:
638
+ >>> parent_node, parent_node_id = get_parent_node(graph_model=my_graph_model, node=my_component)
639
+ >>> print(parent_node, parent_node_id)
640
+ """
641
+ if node is None :
617
642
raise Exception ("Invalid Arguments - component/interface both are None" )
618
643
619
- return node , node_id
644
+ parent_node = None
645
+ parent_node_id = None
646
+
647
+ if isinstance (node , Component ):
648
+ node_name , parent_node_id = graph_model .get_parent (
649
+ node_id = node .node_id ,
650
+ rel = ABCPropertyGraph .REL_HAS ,
651
+ parent = ABCPropertyGraph .CLASS_NetworkNode
652
+ )
653
+ if sliver :
654
+ parent_node = graph_model .build_deep_node_sliver (node_id = parent_node_id )
655
+ elif isinstance (node , Interface ):
656
+ if node .type == InterfaceType .SubInterface :
657
+ # Get the OVS Network Service attached to Sub Interface
658
+ sub_cp_nbs = graph_model .get_first_and_second_neighbor (
659
+ node_id = node .node_id ,
660
+ rel1 = ABCPropertyGraph .REL_CONNECTS ,
661
+ node1_label = ABCPropertyGraph .CLASS_ConnectionPoint ,
662
+ rel2 = ABCPropertyGraph .REL_CONNECTS ,
663
+ node2_label = ABCPropertyGraph .CLASS_NetworkService
664
+ )
665
+ if len (sub_cp_nbs ) == 0 :
666
+ raise Exception (f"Parent (NS-OVS) for Sub Interface: { node .name } cannot be found!" )
667
+
668
+ # Get the component and node associated with Sub Interface
669
+ sub_node = graph_model .get_first_and_second_neighbor (
670
+ node_id = sub_cp_nbs [0 ][1 ],
671
+ rel1 = ABCPropertyGraph .REL_HAS ,
672
+ node1_label = ABCPropertyGraph .CLASS_Component ,
673
+ rel2 = ABCPropertyGraph .REL_HAS ,
674
+ node2_label = ABCPropertyGraph .CLASS_NetworkNode
675
+ )
676
+ if len (sub_node ) == 0 :
677
+ raise Exception (f"Parent for Sub Interface: { node .name } cannot be found!" )
678
+ parent_node_id = sub_node [0 ][1 ]
679
+ if sliver :
680
+ parent_node = graph_model .build_deep_node_sliver (node_id = parent_node_id )
681
+ else :
682
+ node_name , parent_node_id = graph_model .get_parent (
683
+ node_id = node .node_id ,
684
+ rel = ABCPropertyGraph .REL_CONNECTS ,
685
+ parent = ABCPropertyGraph .CLASS_NetworkService
686
+ )
687
+ if sliver :
688
+ parent_node = graph_model .build_deep_ns_sliver (node_id = parent_node_id )
689
+
690
+ return parent_node , parent_node_id
620
691
621
692
@staticmethod
622
693
def prune_graph (* , graph_id : str ) -> ExperimentTopology :
0 commit comments