Skip to content

Commit 9801cc3

Browse files
authored
Merge pull request #396 from fabric-testbed/time-range-check
Bug fixes for issues identified in 1.7
2 parents 195d6e7 + 1f4d93d commit 9801cc3

28 files changed

+229
-91
lines changed

fabric_cf/actor/core/apis/abc_actor_management_object.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def get_reservations(self, *, caller: AuthToken, states: List[int] = None,
239239
slice_id: ID = None, rid: ID = None, oidc_claim_sub: str = None,
240240
email: str = None, rid_list: List[str] = None, type: str = None,
241241
site: str = None, node_id: str = None,
242-
host: str = None, ip_subnet: str = None) -> ResultReservationAvro:
242+
host: str = None, ip_subnet: str = None, full: bool = False) -> ResultReservationAvro:
243243
"""
244244
Get Reservations
245245
@param states states
@@ -255,6 +255,7 @@ def get_reservations(self, *, caller: AuthToken, states: List[int] = None,
255255
@param caller caller
256256
@param host host
257257
@param ip_subnet ip subnet
258+
@param full
258259
259260
@return returns list of the reservations
260261
"""

fabric_cf/actor/core/apis/abc_mgmt_actor.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def accept_update_slice(self, *, slice_id: ID) -> bool:
151151
def get_reservations(self, *, states: List[int] = None, slice_id: ID = None,
152152
rid: ID = None, oidc_claim_sub: str = None, email: str = None, rid_list: List[str] = None,
153153
type: str = None, site: str = None, node_id: str = None,
154-
host: str = None, ip_subnet: str = None) -> List[ReservationMng]:
154+
host: str = None, ip_subnet: str = None, full: bool = False) -> List[ReservationMng]:
155155
"""
156156
Get Reservations
157157
@param states states
@@ -165,6 +165,7 @@ def get_reservations(self, *, states: List[int] = None, slice_id: ID = None,
165165
@param node_id node id
166166
@param ip_subnet ip subnet
167167
@param host host
168+
@param full
168169
Obtains all reservations
169170
@return returns list of the reservations
170171
"""

fabric_cf/actor/core/common/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ class Constants:
200200
MAINT_PROJECT_ID = 'maint.project.id'
201201
INFRASTRUCTURE_PROJECT_ID = "infrastructure.project.id"
202202
TOTAL_SLICE_COUNT_SEED = "total_slice_count_seed"
203+
EXCLUDED_PROJECTS = "excluded.projects"
203204

204205
ELASTIC_TIME = "request.elasticTime"
205206
ELASTIC_SIZE = "request.elasticSize"

fabric_cf/actor/core/kernel/poa.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ def restore(self, *, actor: ABCActorMixin, reservation: ABCReservationMixin):
139139
"""
140140
self.reservation = reservation
141141
self.actor = actor
142-
self.logger = self.actor.get_logger()
142+
if actor:
143+
self.logger = self.actor.get_logger()
143144

144145
# Update slice/sliver info if available
145146
if reservation is not None:

fabric_cf/actor/core/kernel/reservation_client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,9 +1837,10 @@ def update_slice_graph(self, *, sliver: BaseSliver):
18371837
if asm_thread is not None:
18381838
asm_thread.enqueue(graph_id=self.slice.get_graph_id(),
18391839
sliver=sliver, rid=str(self.rid),
1840-
reservation_state=self.state.name,
1840+
reservation_state=str(self.state),
18411841
error_message=error_message)
1842-
self.logger.debug(f"Update ASM completed for Reservation# {self.rid} State# {self.get_reservation_state()} "
1842+
self.logger.debug(f"Update ASM completed for Reservation# {self.rid} "
1843+
f"State# {self.get_reservation_state()} "
18431844
f"Slice Graph# {self.slice.get_graph_id()}")
18441845

18451846
except Exception as e:

fabric_cf/actor/core/kernel/rpc_manager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,9 +488,9 @@ def do_dispatch_incoming_rpc(self, *, actor: ABCActorMixin, rpc: IncomingRPC):
488488
rpc.set_response_handler(response_handler=request.handler)
489489

490490
actor.get_logger().debug(f"Inbound {rpc.get_request_type()} request from "
491-
f"<{rpc.get_caller().get_name()}>:{rpc.get()}")
491+
f"<{rpc.get_caller().get_name()}>:{rpc.get()}")
492492

493-
self.__log_sliver(reservation=rpc.get(), logger=actor.get_logger())
493+
#self.__log_sliver(reservation=rpc.get(), logger=actor.get_logger())
494494

495495
if rpc.get_request_type() == RPCRequestType.QueryResult:
496496
if request is None:
@@ -564,7 +564,7 @@ def enqueue(self, *, rpc: RPCRequest):
564564
from fabric_cf.actor.core.container.globals import GlobalsSingleton
565565
logger = GlobalsSingleton.get().get_logger()
566566
logger.debug(f"Outbound {rpc.get_request_type()} : {rpc.get()}")
567-
self.__log_sliver(reservation=rpc.get(), logger=logger)
567+
#self.__log_sliver(reservation=rpc.get(), logger=logger)
568568
if not self.started:
569569
logger.warning("Ignoring RPC request: container is shutting down")
570570
return

fabric_cf/actor/core/manage/actor_management_object.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ def increment_metrics(self, *, project_id: str, oidc_sub: str, slice_count: int
185185
def get_slice_count(self, *, caller: AuthToken, email: str = None, states: List[int] = None,
186186
project: str = None, user_id: str = None, excluded_projects: List[str] = None) -> int:
187187
try:
188-
return self.db.get_slice_count(email=email, states=states, project_id=project, oidc_sub=user_id)
188+
return self.db.get_slice_count(email=email, states=states, project_id=project, oidc_sub=user_id,
189+
excluded_projects=excluded_projects)
189190
except Exception as e:
190191
self.logger.error("get_slice_count {}".format(e))
191192
return -1
@@ -431,7 +432,7 @@ def get_reservations(self, *, caller: AuthToken, states: List[int] = None,
431432
slice_id: ID = None, rid: ID = None, oidc_claim_sub: str = None,
432433
email: str = None, rid_list: List[str] = None, type: str = None,
433434
site: str = None, node_id: str = None, host: str = None,
434-
ip_subnet: str = None) -> ResultReservationAvro:
435+
ip_subnet: str = None, full: bool = False) -> ResultReservationAvro:
435436
result = ResultReservationAvro()
436437
result.status = ResultAvro()
437438

@@ -464,7 +465,8 @@ def get_reservations(self, *, caller: AuthToken, states: List[int] = None,
464465
r_slice_id = r.get_slice_id()
465466
slice_obj = self.get_slice_by_guid(guid=r_slice_id)
466467
r.restore(actor=self.actor, slice_obj=slice_obj)
467-
full = True if slice_id or rid else False
468+
if not full:
469+
full = True if slice_id or rid else False
468470
rr = Converter.fill_reservation(reservation=r, full=full)
469471
result.reservations.append(rr)
470472
except ReservationNotFoundException as e:

fabric_cf/actor/core/manage/kafka/kafka_actor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def delete_slice(self, *, slice_id: ID) -> bool:
132132
def get_reservations(self, *, states: List[int] = None, slice_id: ID = None,
133133
rid: ID = None, oidc_claim_sub: str = None, email: str = None, rid_list: List[str] = None,
134134
type: str = None, site: str = None, node_id: str = None,
135-
host: str = None, ip_subnet: str = None) -> List[ReservationMng]:
135+
host: str = None, ip_subnet: str = None, full: bool = False) -> List[ReservationMng]:
136136
request = GetReservationsRequestAvro()
137137
request = self.fill_request_by_id_message(request=request, slice_id=slice_id,
138138
states=states, email=email, rid=rid,

fabric_cf/actor/core/manage/local/local_actor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,13 @@ def remove_slice(self, *, slice_id: ID) -> bool:
111111
def get_reservations(self, *, states: List[int] = None, slice_id: ID = None,
112112
rid: ID = None, oidc_claim_sub: str = None, email: str = None, rid_list: List[str] = None,
113113
type: str = None, site: str = None, node_id: str = None,
114-
host: str = None, ip_subnet: str = None) -> List[ReservationMng]:
114+
host: str = None, ip_subnet: str = None, full: bool = False) -> List[ReservationMng]:
115115
self.clear_last()
116116
try:
117117
result = self.manager.get_reservations(caller=self.auth, states=states, slice_id=slice_id, rid=rid,
118118
oidc_claim_sub=oidc_claim_sub, email=email, rid_list=rid_list,
119119
type=type, site=site, node_id=node_id, host=host,
120-
ip_subnet=ip_subnet)
120+
ip_subnet=ip_subnet, full=full)
121121
self.last_status = result.status
122122

123123
if result.status.get_code() == 0:

fabric_cf/actor/core/policy/broker_simpler_units_policy.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,7 @@ def __allocate_services(self, *, rid: ID, inv: NetworkServiceInventory, sliver:
873873
self.logger.info(f"Allocated Interface Sliver: {ifs} delegation: {delegation_id}")
874874

875875
owner_v4_service = self.get_ns_from_switch(switch=owner_switch, ns_type=ServiceType.FABNetv4)
876+
self.logger.info(f"owner_v4_service: {owner_v4_service}")
876877
if owner_v4_service and owner_v4_service.get_labels():
877878
ero_source_end_info.append((owner_switch.node_id, owner_v4_service.get_labels().ipv4))
878879

@@ -891,8 +892,12 @@ def __allocate_services(self, *, rid: ID, inv: NetworkServiceInventory, sliver:
891892
if ServiceType.MPLS == ns.get_type():
892893
owner_mpls_ns = ns
893894
break
894-
delegation_id, delegated_label = InventoryForType.get_delegations(lab_cap_delegations=
895-
owner_ns.get_label_delegations())
895+
if owner_ns and ServiceType.MPLS == owner_ns.get_type():
896+
delegation_id, delegated_label = InventoryForType.get_delegations(lab_cap_delegations=
897+
owner_switch.get_label_delegations())
898+
else:
899+
delegation_id, delegated_label = InventoryForType.get_delegations(lab_cap_delegations=
900+
owner_ns.get_label_delegations())
896901

897902
# Set the Subnet and gateway from the Owner Switch (a)
898903
existing_reservations = self.get_existing_reservations(node_id=owner_ns_id,
@@ -917,7 +922,7 @@ def __allocate_services(self, *, rid: ID, inv: NetworkServiceInventory, sliver:
917922
node_id_to_reservations=node_id_to_reservations, term=term)
918923

919924
if sliver.ero and len(sliver.ero.get()) and len(ero_source_end_info) == 2:
920-
self.logger.info(f"Requested ERO: {sliver.ero}")
925+
self.logger.info(f"Requested ERO: {sliver.ero} {ero_source_end_info}")
921926
ero_hops = []
922927
new_path = [ero_source_end_info[0][1]]
923928
type, path = sliver.ero.get()
@@ -939,11 +944,13 @@ def __allocate_services(self, *, rid: ID, inv: NetworkServiceInventory, sliver:
939944
new_path.append(ero_source_end_info[1][1])
940945

941946
if len(new_path):
947+
'''
942948
if not self.validate_requested_ero_path(source_node=ero_source_end_info[0][0],
943949
end_node=ero_source_end_info[1][0],
944950
hops=ero_hops):
945951
raise BrokerException(error_code=ExceptionErrorCode.INVALID_ARGUMENT,
946952
msg=f"Requested ERO path: {sliver.ero} is invalid!")
953+
'''
947954
ero_path = Path()
948955
ero_path.set_symmetric(new_path)
949956
sliver.ero.set(ero_path)
@@ -997,7 +1004,7 @@ def __allocate_peered_interfaces(self, *, rid: ID, peered_interfaces: List[Inter
9971004
ns_type=sliver.get_type())
9981005
peer_mpls, peer_sw = self.get_network_service_from_graph(node_id=peer_ns_id, parent=True)
9991006

1000-
peer_mpls, peer_ns = self.get_ns(switch=peer_sw, ns_type=sliver.get_type())
1007+
peer_ns = self.get_ns_from_switch(switch=peer_sw, ns_type=sliver.get_type())
10011008

10021009
bqm_interface = None
10031010
for bifs in owner_mpls.interface_info.interfaces.values():
@@ -1020,7 +1027,8 @@ def __allocate_peered_interfaces(self, *, rid: ID, peered_interfaces: List[Inter
10201027
pfs.set_node_map(node_map=(self.combined_broker_model_graph_id, bqm_interface.node_id))
10211028
if pfs.peer_labels is None:
10221029
pfs.peer_labels = Labels()
1023-
pfs.peer_labels = Labels.update(pfs.peer_labels, asn=peer_ns.labels.asn)
1030+
if peer_ns and peer_ns.labels:
1031+
pfs.peer_labels = Labels.update(pfs.peer_labels, asn=peer_ns.labels.asn)
10241032
self.logger.info(f"Allocated Peered Interface Sliver: {pfs}")
10251033

10261034
# Update the Network Service Sliver Node Map
@@ -1380,16 +1388,6 @@ def get_shortest_path(self, *, src_node_id: str, dest_node_id: str):
13801388
finally:
13811389
self.lock.release()
13821390

1383-
def get_ns(self, *, switch: NodeSliver, ns_type: ServiceType) -> Tuple[NetworkServiceSliver, NetworkServiceSliver]:
1384-
peer_mpls = peer_ns = None
1385-
for ns in switch.network_service_info.network_services.values():
1386-
if ServiceType.MPLS == ns.get_type():
1387-
peer_mpls = ns
1388-
if ns.get_type() == ns_type:
1389-
peer_ns = ns
1390-
1391-
return peer_mpls, peer_ns
1392-
13931391
def get_peer_node(self, *, site: str, node_type: str, node_name: str) -> NodeSliver:
13941392
if node_type == str(NodeType.Facility):
13951393
peer_node = self.get_facility_sliver(node_name=f'{site},{node_name}')

fabric_cf/actor/core/policy/network_node_control.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from fim.slivers.attached_components import AttachedComponentsInfo
2929
from fim.slivers.base_sliver import BaseSliver
3030
from fim.slivers.network_node import NodeSliver
31-
from fim.user import Capacities, ComponentType
31+
from fim.user import Capacities, ComponentType, Labels
3232

3333
from fabric_cf.actor.core.apis.abc_authority_reservation import ABCAuthorityReservation
3434
from fabric_cf.actor.core.apis.abc_reservation_mixin import ABCReservationMixin
@@ -219,12 +219,18 @@ def assign(self, *, reservation: ABCAuthorityReservation, delegation_name: str,
219219
properties=reservation.get_slice().get_config_properties())
220220
gained = UnitSet(plugin=self.authority.get_plugin(), units={unit.reservation_id: unit})
221221
else:
222-
self.logger.info(f"Extend Lease for now, no modify supported res# {reservation}")
223222
current_sliver = current.get_sliver()
224223
diff = current_sliver.diff(other_sliver=requested)
225224
if diff is not None:
225+
if requested.get_label_allocations() and current_sliver.get_label_allocations():
226+
requested.label_allocations = Labels.update(current_sliver.label_allocations)
227+
else:
228+
requested.set_label_allocations(current_sliver.get_label_allocations())
229+
requested.set_management_ip(current_sliver.get_management_ip())
230+
226231
# Modify MVP - only handle add components for now
227232
if len(diff.added.components) > 0:
233+
self.logger.info(f"Extend Lease - modify add res# {reservation}")
228234
self.__check_components(rid=reservation.get_reservation_id(),
229235
requested_components=requested.attached_components_info,
230236
graph_node=graph_node,
@@ -235,13 +241,16 @@ def assign(self, *, reservation: ABCAuthorityReservation, delegation_name: str,
235241
properties=reservation.get_slice().get_config_properties())
236242
modified = UnitSet(plugin=self.authority.get_plugin(), units={unit.reservation_id: unit})
237243
elif len(diff.removed.components) > 0 or len(diff.modified.components):
244+
self.logger.info(f"Extend Lease - modify rem/modify res# {reservation}")
238245
unit = Unit(rid=reservation.get_reservation_id(), slice_id=reservation.get_slice_id(),
239246
actor_id=self.authority.get_guid(), sliver=requested, rtype=resource_type,
240247
properties=reservation.get_slice().get_config_properties())
241248
modified = UnitSet(plugin=self.authority.get_plugin(), units={unit.reservation_id: unit})
242249
else:
250+
self.logger.info(f"Extend Lease res# {reservation}")
243251
return current
244252
else:
253+
self.logger.info(f"Extend Lease res# {reservation}")
245254
return current
246255

247256
result = ResourceSet(gained=gained, modified=modified, lost=lost, rtype=resource_type)

fabric_cf/actor/core/policy/network_service_inventory.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ def allocate(self, *, rid: ID, requested_ns: NetworkServiceSliver, owner_ns: Net
360360
return requested_ns
361361

362362
gateway_labels = self._assign_gateway_labels(ip_network=ip_network, subnet_list=subnet_list,
363-
requested_ns_type=requested_ns.get_type())
363+
requested_ns=requested_ns)
364364

365365
self.logger.debug(f"Gateway Labels: {gateway_labels}")
366366

@@ -487,25 +487,41 @@ def _get_allocated_sliver(self, reservation: ABCReservationMixin) -> NetworkServ
487487
self.logger.error("Could not find the allocated Sliver - should not reach here!")
488488

489489
def _assign_gateway_labels(self, *, ip_network: Union[IPv4Network, IPv6Network], subnet_list: List,
490-
requested_ns_type: str) -> Labels:
490+
requested_ns: NetworkServiceSliver) -> Labels:
491491
"""
492492
Assign gateway labels based on the requested network service type.
493493
494494
:param ip_network: The IP network from which subnets are derived, either IPv4Network or IPv6Network.
495495
:param subnet_list: A list of subnets derived from the ip_network.
496-
:param requested_ns_type: The type of the requested network service.
496+
:param requested_ns: Network Service sliver.
497497
:return: Gateway labels populated with the appropriate subnet and IP address.
498498
"""
499499
gateway_labels = Labels()
500-
if requested_ns_type == ServiceType.FABNetv4:
500+
if requested_ns.get_type() == ServiceType.FABNetv4:
501+
# Allocate the requested network if available else allocate new network
502+
if requested_ns.gateway and requested_ns.gateway.lab and requested_ns.gateway.lab.ipv4_subnet:
503+
requested_subnet = IPv4Network(requested_ns.gateway.lab.ipv4_subnet)
504+
if requested_subnet in subnet_list:
505+
gateway_labels.ipv4_subnet = requested_subnet.with_prefixlen
506+
gateway_labels.ipv4 = str(next(requested_subnet.hosts()))
507+
return gateway_labels
508+
501509
gateway_labels.ipv4_subnet = subnet_list[0].with_prefixlen
502510
gateway_labels.ipv4 = str(list(subnet_list[0].hosts())[0])
503511

504-
elif requested_ns_type == ServiceType.FABNetv4Ext:
512+
elif requested_ns.get_type() == ServiceType.FABNetv4Ext:
505513
gateway_labels.ipv4_subnet = ip_network.with_prefixlen
506514
gateway_labels.ipv4 = str(subnet_list[0])
507515

508-
elif requested_ns_type in Constants.L3_FABNETv6_SERVICES:
516+
elif requested_ns.get_type() in Constants.L3_FABNETv6_SERVICES:
517+
# Allocate the requested network if available else allocate new network
518+
if requested_ns.gateway and requested_ns.gateway.lab and requested_ns.gateway.lab.ipv6_subnet:
519+
requested_subnet = IPv6Network(requested_ns.gateway.lab.ipv6_subnet)
520+
if requested_subnet in subnet_list:
521+
gateway_labels.ipv6_subnet = requested_subnet.with_prefixlen
522+
gateway_labels.ipv6 = str(next(requested_subnet.hosts()))
523+
return gateway_labels
524+
509525
gateway_labels.ipv6_subnet = subnet_list[0].with_prefixlen
510526
gateway_labels.ipv6 = str(next(subnet_list[0].hosts()))
511527

0 commit comments

Comments
 (0)