Skip to content

Commit 2afc424

Browse files
authored
Merge pull request #397 from fabric-testbed/al2s-slice-state
Al2s slice state
2 parents 9801cc3 + 1c3b387 commit 2afc424

File tree

7 files changed

+93
-50
lines changed

7 files changed

+93
-50
lines changed

fabric_cf/actor/core/kernel/slice_state_machine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def transition_slice(self, *, operation: SliceOperation, reservations: Reservati
323323
ReservationStates.Failed, ReservationStates.CloseFail):
324324
self.state = SliceState.Closing
325325

326-
if self.state in [SliceState.AllocatedOK, SliceState.AllocatedError]:
326+
elif self.state in [SliceState.AllocatedOK, SliceState.AllocatedError]:
327327
if not bins.has_state_other_than(ReservationStates.Active, ReservationStates.Closed,
328328
ReservationStates.CloseFail):
329329
if not has_error:

fabric_cf/actor/core/policy/network_node_inventory.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,6 @@ def __update_shared_nic_labels_and_capacities(self, *, available_component: Comp
120120
raise BrokerException(error_code=ExceptionErrorCode.INSUFFICIENT_RESOURCES,
121121
msg=f"{message}")
122122

123-
# Assign the first PCI Id from the list of available PCI slots
124-
requested_component.label_allocations = Labels(bdf=delegated_label.bdf[0], numa=delegated_label.numa[0])
125-
126123
# Find the VLAN from the BQM Component
127124
if available_component.network_service_info is None or \
128125
len(available_component.network_service_info.network_services) != 1:
@@ -145,14 +142,25 @@ def __update_shared_nic_labels_and_capacities(self, *, available_component: Comp
145142

146143
delegation_id, ifs_delegated_labels = self.get_delegations(lab_cap_delegations=ifs.get_label_delegations())
147144

148-
# Determine the index which points to the same PCI id as assigned above
149-
# This index points to the other relevant information such as MAC Address,
150-
# VLAN tag for that PCI device
151-
i = 0
152-
for pci_id in ifs_delegated_labels.bdf:
153-
if pci_id == delegated_label.bdf[0]:
154-
break
155-
i += 1
145+
assigned_bdf = delegated_label.bdf[0]
146+
assigned_numa = delegated_label.numa[0]
147+
148+
# Check if the requested component's VLAN exists in the delegated labels
149+
if requested_component.labels and requested_component.labels.vlan and \
150+
requested_component.labels.vlan in ifs_delegated_labels.vlan:
151+
vlan_index = ifs_delegated_labels.vlan.index(requested_component.labels.vlan)
152+
bdf_for_requested_vlan = ifs_delegated_labels.bdf[vlan_index]
153+
154+
if bdf_for_requested_vlan in delegated_label.bdf:
155+
bdf_index = delegated_label.bdf.index(bdf_for_requested_vlan)
156+
assigned_bdf = bdf_for_requested_vlan
157+
assigned_numa = delegated_label.numa[bdf_index]
158+
159+
# Assign the first PCI Id from the list of available PCI slots
160+
requested_component.label_allocations = Labels(bdf=assigned_bdf, numa=assigned_numa)
161+
162+
# Find index of assigned BDF in the interface delegated labels
163+
assigned_index = ifs_delegated_labels.bdf.index(assigned_bdf)
156164

157165
# Updated the Requested component with VLAN, BDF, MAC
158166
req_ns_name = next(iter(requested_component.network_service_info.network_services))
@@ -162,11 +170,12 @@ def __update_shared_nic_labels_and_capacities(self, *, available_component: Comp
162170

163171
# Do not copy VLAN for OpenStack-vNIC
164172
if requested_component.get_model() == Constants.OPENSTACK_VNIC_MODEL:
165-
lab = Labels(bdf=ifs_delegated_labels.bdf[i], mac=ifs_delegated_labels.mac[i],
166-
local_name=ifs_delegated_labels.local_name[i])
173+
lab = Labels(bdf=ifs_delegated_labels.bdf[assigned_index], mac=ifs_delegated_labels.mac[assigned_index],
174+
local_name=ifs_delegated_labels.local_name[assigned_index])
167175
else:
168-
lab = Labels(bdf=ifs_delegated_labels.bdf[i], mac=ifs_delegated_labels.mac[i],
169-
vlan=ifs_delegated_labels.vlan[i], local_name=ifs_delegated_labels.local_name[i])
176+
lab = Labels(bdf=ifs_delegated_labels.bdf[assigned_index], mac=ifs_delegated_labels.mac[assigned_index],
177+
vlan=ifs_delegated_labels.vlan[assigned_index],
178+
local_name=ifs_delegated_labels.local_name[assigned_index])
170179

171180
# For the Layer 2 copying the IP address to the label allocations
172181
# This is to be used by AM Handler to configure Network Interface

fabric_cf/actor/fim/asm_update_thread.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,17 @@ class AsmUpdateException(Exception):
4343

4444
class AsmEvent:
4545
def __init__(self, *, graph_id: str, sliver: BaseSliver, reservation_id: str,
46-
state: str, error_message: str):
46+
state: str, error_message: str, logger: logging.Logger = None):
4747
self.graph_id = graph_id
4848
self.sliver = sliver
4949
self.reservation_id = reservation_id
5050
self.state = state
5151
self.error_message = error_message
52+
self.logger = logger
5253

5354
def process(self):
55+
if self.logger:
56+
self.logger.debug(f"AsmEvent for Res# {self.reservation_id} State: {self.state} Graph: {self.graph_id}")
5457
FimHelper.update_node(graph_id=self.graph_id, sliver=self.sliver, reservation_id=self.reservation_id,
5558
state=self.state, error_message=self.error_message)
5659

@@ -124,7 +127,7 @@ def enqueue(self, *, graph_id: str, sliver: BaseSliver, rid: str, reservation_st
124127
error_message: str):
125128
try:
126129
event = AsmEvent(graph_id=graph_id, sliver=sliver, reservation_id=rid,
127-
state=reservation_state, error_message=error_message)
130+
state=reservation_state, error_message=error_message, logger=self.logger)
128131
self.event_queue.put_nowait(event)
129132
with self.condition:
130133
self.condition.notify_all()

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: 4 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,12 @@ 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
518516
modify_state = slice_object.has_sliver_updates_at_authority()
517+
FimHelper.delete_graph(graph_id=slice_obj.get_graph_id())
518+
graph_id = asm_graph.get_graph_id()
519519

520-
slice_obj.graph_id = asm_graph.get_graph_id()
520+
slice_obj.graph_id = graph_id
521521
config_props = slice_obj.get_config_properties()
522522
config_props[Constants.PROJECT_ID] = project
523523
config_props[Constants.TAGS] = ','.join(tags)

fabric_cf/orchestrator/core/orchestrator_slice_wrapper.py

Lines changed: 46 additions & 20 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
@@ -333,7 +333,7 @@ def __build_ns_sliver_reservation(self, *, slice_graph: ABCASMPropertyGraph, nod
333333
if sliver.labels is None:
334334
sliver.labels = Labels()
335335
sliver.labels = Labels.update(sliver.labels,
336-
local_name=f"{self.slice_obj.get_slice_name()}-{ifs.peer_labels.account_id}")
336+
local_name=f"{self.slice_obj.get_slice_name()}")
337337

338338
# Generate reservation for the sliver
339339
reservation = self.reservation_converter.generate_reservation(sliver=sliver,
@@ -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

tools/db_cli.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ class MainClass:
4646
GlobalsSingleton.get().load_config()
4747
GlobalsSingleton.get().initialized = True
4848

49-
def __init__(self, user: str, password: str, db: str, host: str = '127.0.0.1:5432'):
49+
def __init__(self, user: str, password: str, db: str, host: str = 'orchestrator-db:5432'):
5050
self.logger = logging.getLogger("db-cli")
5151
file_handler = RotatingFileHandler('./db_cli.log', backupCount=5, maxBytes=50000)
5252
logging.basicConfig(level=logging.DEBUG,
5353
format="%(asctime)s [%(filename)s:%(lineno)d] [%(levelname)s] %(message)s",
5454
handlers=[logging.StreamHandler(), file_handler])
5555

5656
self.db = ActorDatabase(user=user, password=password, database=db, db_host=host, logger=self.logger)
57-
self.neo4j_config = {"url": "neo4j://0.0.0.0:9687",
57+
self.neo4j_config = {"url": "neo4j://orchestrator-neo4j:9687",
5858
"user": "neo4j",
5959
"pass": "password",
6060
"import_host_dir": "/Users/kthare10/renci/code/fabric/ControlFramework/neo4j1/imports/",
@@ -63,10 +63,10 @@ def __init__(self, user: str, password: str, db: str, host: str = '127.0.0.1:543
6363
def get_slices(self, email: str = None, slice_id: str = None, slice_name: str = None):
6464
try:
6565
if slice_id is not None:
66-
slice_obj = self.db.get_slice(slice_id=ID(uid=slice_id))
66+
slice_obj = self.db.get_slices(slice_id=ID(uid=slice_id))
6767
slice_list = [slice_obj]
6868
elif email is not None:
69-
slice_list = self.db.get_slice_by_email(email=email)
69+
slice_list = self.db.get_slices(email=email)
7070
else:
7171
slice_list = self.db.get_slices()
7272

0 commit comments

Comments
 (0)