Skip to content

Commit cc82ec1

Browse files
committed
only update slice graph if there are any diffs
1 parent 955f488 commit cc82ec1

File tree

3 files changed

+63
-27
lines changed

3 files changed

+63
-27
lines changed

fabric_cf/actor/fim/fim_helper.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,21 +316,26 @@ def get_delegation(delegated_capacities: Delegations, delegation_name: str) -> C
316316
return delegation.get_details() if delegation is not None else None
317317

318318
@staticmethod
319-
def update_node(*, graph_id: str, sliver: BaseSliver, reservation_id: str,
320-
state: str, error_message: str):
319+
def update_node(*, sliver: BaseSliver, reservation_id: str, state: str, error_message: str, graph_id: str = None,
320+
asm_graph: ABCASMPropertyGraph = None):
321321
"""
322322
Update Sliver Node in ASM
323323
:param graph_id:
324324
:param sliver:
325325
:param reservation_id:
326326
:param state:
327327
:param error_message:
328+
:param asm_graph:
328329
:return:
329330
"""
330331
if sliver is None:
331332
return
332-
graph = FimHelper.get_graph(graph_id=graph_id)
333-
asm_graph = Neo4jASMFactory.create(graph=graph)
333+
if graph_id is None and asm_graph is None:
334+
return
335+
if graph_id:
336+
graph = FimHelper.get_graph(graph_id=graph_id)
337+
asm_graph = Neo4jASMFactory.create(graph=graph)
338+
334339
neo4j_topo = ExperimentTopology()
335340
neo4j_topo.cast(asm_graph=asm_graph)
336341

fabric_cf/orchestrator/core/orchestrator_handler.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def modify_slice(self, *, token: str, slice_id: str, slice_graph: str) -> List[d
503503
slice_obj=slice_obj, logger=self.logger)
504504

505505
# Compute the reservations
506-
computed_reservations = slice_object.modify(new_slice_graph=asm_graph)
506+
topology_diff, computed_reservations = slice_object.modify(new_slice_graph=asm_graph)
507507
slice_object.update_topology(topology=topology)
508508

509509
# Check if Test Bed or site is in maintenance
@@ -512,12 +512,17 @@ def modify_slice(self, *, token: str, slice_id: str, slice_graph: str) -> List[d
512512
# Add any new reservations to the database
513513
slice_object.add_reservations()
514514

515-
FimHelper.delete_graph(graph_id=slice_obj.get_graph_id())
516-
517515
# Slice has sliver modifications - add/remove/update for slivers requiring AM updates
516+
graph_id = slice_obj.get_graph_id()
518517
modify_state = slice_object.has_sliver_updates_at_authority()
518+
if modify_state and slice_object.has_topology_diffs(topology_diff=topology_diff):
519+
FimHelper.delete_graph(graph_id=slice_obj.get_graph_id())
520+
graph_id = asm_graph.get_graph_id()
521+
else:
522+
if asm_graph:
523+
asm_graph.delete_graph()
519524

520-
slice_obj.graph_id = asm_graph.get_graph_id()
525+
slice_obj.graph_id = graph_id
521526
config_props = slice_obj.get_config_properties()
522527
config_props[Constants.PROJECT_ID] = project
523528
config_props[Constants.TAGS] = ','.join(tags)

fabric_cf/orchestrator/core/orchestrator_slice_wrapper.py

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from fim.slivers.instance_catalog import InstanceCatalog
4242
from fim.slivers.network_node import NodeSliver, NodeType
4343
from fim.slivers.network_service import NetworkServiceSliver
44-
from fim.slivers.topology_diff import WhatsModifiedFlag
44+
from fim.slivers.topology_diff import WhatsModifiedFlag, TopologyDiff
4545
from fim.user import ServiceType, ExperimentTopology, InterfaceType
4646

4747
from fabric_cf.actor.core.common.constants import ErrorCodes, Constants
@@ -460,7 +460,7 @@ def __build_network_node_reservations(self, *, slice_graph: ABCASMPropertyGraph)
460460
sliver_to_res_mapping[nn_id] = reservation.get_reservation_id()
461461
return reservations, sliver_to_res_mapping
462462

463-
def modify(self, *, new_slice_graph: ABCASMPropertyGraph) -> List[LeaseReservationAvro]:
463+
def modify(self, *, new_slice_graph: ABCASMPropertyGraph) -> Tuple[TopologyDiff, List[LeaseReservationAvro]]:
464464
"""
465465
Modify an existing slice
466466
:param new_slice_graph New Slice Graph
@@ -478,8 +478,8 @@ def modify(self, *, new_slice_graph: ABCASMPropertyGraph) -> List[LeaseReservati
478478
ns_peered_reservations = []
479479
ns_mapping = {}
480480

481-
if topology_diff is None:
482-
return reservations
481+
if not topology_diff:
482+
return topology_diff, reservations
483483

484484
node_res_mapping = {}
485485

@@ -624,7 +624,7 @@ def modify(self, *, new_slice_graph: ABCASMPropertyGraph) -> List[LeaseReservati
624624
for x in modified_reservations:
625625
self.computed_reservations.append(x)
626626

627-
return self.computed_reservations
627+
return topology_diff, self.computed_reservations
628628

629629
def __check_modify_on_fabnetv4ext(self, *, rid: str, req_sliver: NetworkServiceSliver) -> NetworkServiceSliver:
630630
if req_sliver.get_type() != ServiceType.FABNetv4Ext:
@@ -704,21 +704,47 @@ def __check_modify_on_fabnetv4ext(self, *, rid: str, req_sliver: NetworkServiceS
704704

705705
return req_sliver
706706

707-
def update_topology(self, *, topology: ExperimentTopology):
708-
for x in self.computed_reservations:
709-
sliver = x.get_sliver()
710-
node_name = sliver.get_name()
711-
if isinstance(sliver, NodeSliver) and node_name in topology.nodes:
712-
node = topology.nodes[node_name]
713-
node.set_properties(labels=sliver.labels,
714-
label_allocations=sliver.label_allocations,
715-
capacity_allocations=sliver.capacity_allocations,
716-
reservation_info=sliver.reservation_info,
717-
node_map=sliver.node_map,
718-
management_ip=sliver.management_ip,
719-
capacity_hints=sliver.capacity_hints,
720-
capacities=sliver.capacities)
707+
def update_topology(self, *, topology: ExperimentTopology = None,
708+
asm_graph: ABCASMPropertyGraph = None):
709+
if topology:
710+
for x in self.computed_reservations:
711+
sliver = x.get_sliver()
712+
node_name = sliver.get_name()
713+
if isinstance(sliver, NodeSliver) and node_name in topology.nodes:
714+
node = topology.nodes[node_name]
715+
node.set_properties(labels=sliver.labels,
716+
label_allocations=sliver.label_allocations,
717+
capacity_allocations=sliver.capacity_allocations,
718+
reservation_info=sliver.reservation_info,
719+
node_map=sliver.node_map,
720+
management_ip=sliver.management_ip,
721+
capacity_hints=sliver.capacity_hints,
722+
capacities=sliver.capacities)
721723

722724
def has_sliver_updates_at_authority(self):
723725
return len(self.computed_reservations) or len(self.computed_remove_reservations) or \
724726
len(self.computed_modify_reservations) or len(self.computed_modify_properties_reservations)
727+
728+
def has_topology_diffs(self, *, topology_diff: TopologyDiff) -> bool:
729+
"""
730+
Check if there any updates in topology
731+
:param topology_diff: topology difference object
732+
"""
733+
ret_val = False
734+
if not topology_diff:
735+
ret_val = False
736+
737+
if len(topology_diff.added.nodes) or len(topology_diff.added.components) or \
738+
len(topology_diff.added.services) or len(topology_diff.added.interfaces):
739+
ret_val = True
740+
741+
if len(topology_diff.removed.nodes) or len(topology_diff.removed.components) or \
742+
len(topology_diff.removed.services) or len(topology_diff.removed.interfaces):
743+
ret_val = True
744+
745+
if len(topology_diff.modified.nodes) or len(topology_diff.modified.components) or \
746+
len(topology_diff.modified.services) or len(topology_diff.modified.interfaces):
747+
ret_val = True
748+
749+
self.logger.debug(f"Topology diff found: {ret_val}")
750+
return ret_val

0 commit comments

Comments
 (0)