Skip to content

Commit 07f8c6c

Browse files
authored
Merge pull request #171 from fabric-testbed/sql_index
Error reporting and get_slices performance
2 parents 1b3aac2 + dc6fec0 commit 07f8c6c

18 files changed

+251
-286
lines changed

fabric_cf/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__VERSION__ = "1.1.1"
1+
__VERSION__ = "1.1.2"

fabric_cf/actor/core/kernel/kernel_wrapper.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,8 @@ def claim_delegation_request(self, *, delegation: ABCDelegation, caller: AuthTok
9797
if delegation is None or caller is None or callback is None:
9898
raise KernelException(Constants.INVALID_ARGUMENT)
9999

100-
if id_token is not None:
101-
AccessChecker.check_access(action_id=ActionId.claim, resource_type=ResourceType.delegation,
102-
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
100+
AccessChecker.check_access(action_id=ActionId.claim, resource_type=ResourceType.delegation,
101+
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
103102

104103
# Note: for claim we do not need the slice object, so we use
105104
# validate_delegation(delegation_id) instead of validate_delegation(delegation).
@@ -123,9 +122,8 @@ def reclaim_delegation_request(self, *, delegation: ABCDelegation, caller: AuthT
123122
if delegation is None or caller is None or callback is None:
124123
raise KernelException(Constants.INVALID_ARGUMENT)
125124

126-
if id_token is not None:
127-
AccessChecker.check_access(action_id=ActionId.claim, resource_type=ResourceType.delegation,
128-
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
125+
AccessChecker.check_access(action_id=ActionId.claim, resource_type=ResourceType.delegation,
126+
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
129127

130128
# Note: for claim we do not need the slice object, so we use
131129
# validate(ReservationID) instead of validate(Reservation).
@@ -598,9 +596,8 @@ def query(self, *, properties: dict, caller: AuthToken, id_token: str):
598596
@param id_token id_token
599597
@return query response
600598
"""
601-
if id_token is not None:
602-
AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.resources,
603-
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
599+
AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.resources,
600+
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
604601

605602
return self.kernel.query(properties=properties)
606603

fabric_cf/actor/core/kernel/reservation_client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1652,8 +1652,14 @@ def update_slice_graph(self, *, sliver: BaseSliver):
16521652
"""
16531653
self.logger.debug(f"Updating ASM for Reservation# {self.rid} State# {self.get_reservation_state()} "
16541654
f"Slice Graph# {self.slice.get_graph_id()}")
1655+
error_message = self.get_error_message()
1656+
if error_message is None:
1657+
error_message = self.get_last_ticket_update()
1658+
if error_message is None:
1659+
error_message = self.get_last_lease_update()
16551660
self.slice.update_slice_graph(sliver=sliver, rid=str(self.rid),
1656-
reservation_state=self.state.name)
1661+
reservation_state=self.state.name,
1662+
error_message=error_message)
16571663
self.logger.debug(f"Update ASM completed for Reservation# {self.rid} State# {self.get_reservation_state()} "
16581664
f"Slice Graph# {self.slice.get_graph_id()}")
16591665

fabric_cf/actor/core/kernel/slice.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,8 @@ def set_config_properties(self, *, value: dict):
304304
def get_config_properties(self) -> dict:
305305
return self.config_properties
306306

307-
def update_slice_graph(self, sliver: BaseSliver, rid: str, reservation_state: str) -> BaseSliver:
307+
def update_slice_graph(self, sliver: BaseSliver, rid: str, reservation_state: str,
308+
error_message: str) -> BaseSliver:
308309
try:
309310
self.lock.acquire()
310311
# Update for Orchestrator for Active / Ticketed Reservations
@@ -313,6 +314,7 @@ def update_slice_graph(self, sliver: BaseSliver, rid: str, reservation_state: st
313314
sliver.reservation_info = ReservationInfo()
314315
sliver.reservation_info.reservation_id = rid
315316
sliver.reservation_info.reservation_state = reservation_state
317+
sliver.reservation_info.error_message = error_message
316318
FimHelper.update_node(graph_id=self.graph_id, sliver=sliver)
317319
return sliver
318320
finally:

fabric_cf/actor/core/kernel/slice_state_machine.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def str_list_to_state_list(states: list):
6161
if states is None or len(states) == 0:
6262
return states
6363

64-
result = [SliceState.StableOK, SliceState.StableError, SliceState.Dead, SliceState.Closing,
65-
SliceState.Configuring, SliceState.Nascent]
64+
result = [SliceState.StableOK, SliceState.StableError, SliceState.Dead,
65+
SliceState.Closing, SliceState.Configuring, SliceState.Nascent]
6666
states_to_exclude = []
6767
for s in result:
6868
if str(s) not in states:
@@ -71,7 +71,10 @@ def str_list_to_state_list(states: list):
7171
for s in states_to_exclude:
7272
result.remove(s)
7373

74-
return result
74+
ret_val = []
75+
for x in result:
76+
ret_val.append(x.value)
77+
return ret_val
7578

7679

7780
class SliceCommand(Enum):

fabric_cf/actor/core/manage/actor_management_object.py

Lines changed: 63 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from __future__ import annotations
2727

2828
from datetime import date, datetime
29-
from typing import TYPE_CHECKING, List
29+
from typing import TYPE_CHECKING, List, Tuple
3030

3131
from fabric_mb.message_bus.messages.reservation_mng import ReservationMng
3232
from fabric_mb.message_bus.messages.reservation_state_avro import ReservationStateAvro
@@ -69,6 +69,23 @@ def __init__(self, *, actor: ABCActorMixin = None):
6969
if actor is not None:
7070
self.set_actor(actor=actor)
7171

72+
def validate_token(self, *, id_token: str, action_id: ActionId, resource_type: ResourceType,
73+
resource_id: str = None) -> Tuple[str, str]:
74+
user_dn = None
75+
user_email = None
76+
fabric_token = AccessChecker.check_access(action_id=action_id,
77+
resource_type=resource_type,
78+
token=id_token, logger=self.logger,
79+
actor_type=self.actor.get_type(),
80+
resource_id=resource_id)
81+
if fabric_token is not None:
82+
user_dn = fabric_token.get_decoded_token().get(Constants.CLAIMS_SUB, None)
83+
user_email = fabric_token.get_decoded_token().get(Constants.CLAIMS_EMAIL, None)
84+
85+
if user_dn is None:
86+
raise ManageException(ErrorCodes.ErrorInvalidToken)
87+
return user_dn, user_email
88+
7289
def register_protocols(self):
7390
from fabric_cf.actor.core.manage.local.local_actor import LocalActor
7491
local = ProxyProtocolDescriptor(protocol=Constants.PROTOCOL_LOCAL, proxy_class=LocalActor.__name__,
@@ -111,7 +128,7 @@ def set_actor(self, *, actor: ABCActorMixin):
111128
self.id = actor.get_guid()
112129

113130
def get_slices(self, *, slice_id: ID, caller: AuthToken, id_token: str = None,
114-
slice_name: str = None, email: str = None) -> ResultSliceAvro:
131+
slice_name: str = None, email: str = None, state: List[int] = None) -> ResultSliceAvro:
115132
result = ResultSliceAvro()
116133
result.status = ResultAvro()
117134

@@ -120,21 +137,14 @@ def get_slices(self, *, slice_id: ID, caller: AuthToken, id_token: str = None,
120137
result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret())
121138
else:
122139
slice_list = None
123-
user_dn = None
124-
user_email = email
140+
125141
try:
126-
if id_token is not None:
127-
fabric_token = AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.slice,
128-
token=id_token, logger=self.logger,
129-
actor_type=self.actor.get_type(),
130-
resource_id=str(slice_id))
131-
user_dn = fabric_token.get_decoded_token().get(Constants.CLAIMS_SUB, None)
132-
user_email = fabric_token.get_decoded_token().get(Constants.CLAIMS_EMAIL, None)
133-
134-
if user_dn is None:
135-
result.status.set_code(ErrorCodes.ErrorInvalidToken.value)
136-
result.status.set_message(ErrorCodes.ErrorInvalidToken.interpret())
137-
return result
142+
user_dn, user_email = self.validate_token(id_token=id_token, action_id=ActionId.query,
143+
resource_type=ResourceType.slice,
144+
resource_id=str(slice_id))
145+
146+
if user_email is None:
147+
user_email = email
138148

139149
try:
140150
slice_list = None
@@ -146,10 +156,13 @@ def get_slices(self, *, slice_id: ID, caller: AuthToken, id_token: str = None,
146156
elif slice_name is not None:
147157
slice_list = self.db.get_slice_by_name(slice_name=slice_name, oidc_claim_sub=user_dn,
148158
email=user_email)
159+
elif user_email is not None:
160+
if state is None:
161+
slice_list = self.db.get_slice_by_email(email=user_email)
162+
else:
163+
slice_list = self.db.get_slice_by_email_state(email=user_email, state=state)
149164
elif user_dn is not None:
150165
slice_list = self.db.get_slice_by_oidc_claim_sub(oidc_claim_sub=user_dn)
151-
elif user_email is not None:
152-
slice_list = self.db.get_slice_by_email(email=user_email)
153166
else:
154167
slice_list = self.db.get_slices()
155168

@@ -180,21 +193,9 @@ def add_slice(self, *, slice_obj: SliceAvro, caller: AuthToken, id_token: str =
180193

181194
else:
182195
try:
183-
user_dn = None
184-
user_email = None
185-
if id_token is not None:
186-
fabric_token = AccessChecker.check_access(action_id=ActionId.query,
187-
resource_type=ResourceType.slice,
188-
token=id_token, logger=self.logger,
189-
actor_type=self.actor.get_type(),
190-
resource_id=str(slice_obj.slice_name))
191-
user_dn = fabric_token.get_decoded_token().get(Constants.CLAIMS_SUB, None)
192-
user_email = fabric_token.get_decoded_token().get(Constants.CLAIMS_EMAIL, None)
193-
194-
if user_dn is None:
195-
result.status.set_code(ErrorCodes.ErrorInvalidToken.value)
196-
result.status.set_message(ErrorCodes.ErrorInvalidToken.interpret())
197-
return result
196+
user_dn, user_email = self.validate_token(id_token=id_token, action_id=ActionId.query,
197+
resource_type=ResourceType.slice,
198+
resource_id=str(slice_obj.slice_name))
198199

199200
slice_obj_new = SliceFactory.create(slice_id=ID(), name=slice_obj.get_slice_name())
200201

@@ -248,12 +249,9 @@ def remove_slice(self, *, slice_id: ID, caller: AuthToken, id_token: str = None)
248249
return result
249250

250251
try:
251-
if id_token is not None:
252-
AccessChecker.check_access(action_id=ActionId.delete,
253-
resource_type=ResourceType.slice,
254-
token=id_token, logger=self.logger,
255-
actor_type=self.actor.get_type(),
256-
resource_id=str(slice_id))
252+
self.validate_token(id_token=id_token, action_id=ActionId.delete,
253+
resource_type=ResourceType.slice,
254+
resource_id=str(slice_id))
257255

258256
class Runner(ABCActorRunnable):
259257
def __init__(self, *, actor: ABCActorMixin):
@@ -317,10 +315,9 @@ def run(self):
317315
def get_slice_by_guid(self, *, guid: str, id_token: str = None) -> ABCSlice:
318316
return self.db.get_slice(slice_id=guid)
319317

320-
def get_reservations(self, *, caller: AuthToken, id_token: str = None, state: int = None,
318+
def get_reservations(self, *, caller: AuthToken, id_token: str = None, state: List[int] = None,
321319
slice_id: ID = None, rid: ID = None, oidc_claim_sub: str = None,
322-
email: str = None, rid_list: List[str] = None,
323-
notices_as_dict: bool = False) -> ResultReservationAvro:
320+
email: str = None, rid_list: List[str] = None) -> ResultReservationAvro:
324321
result = ResultReservationAvro()
325322
result.status = ResultAvro()
326323

@@ -330,20 +327,15 @@ def get_reservations(self, *, caller: AuthToken, id_token: str = None, state: in
330327
return result
331328

332329
try:
333-
user_dn = oidc_claim_sub
334-
user_email = email
335-
if id_token is not None:
336-
fabric_token = AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.sliver,
337-
token=id_token, logger=self.logger,
338-
actor_type=self.actor.get_type(),
339-
resource_id=str(rid))
340-
user_dn = fabric_token.get_decoded_token().get(Constants.CLAIMS_SUB, None)
341-
user_email = fabric_token.get_decoded_token().get(Constants.CLAIMS_EMAIL, None)
342-
343-
if user_dn is None:
344-
result.status.set_code(ErrorCodes.ErrorInvalidToken.value)
345-
result.status.set_message(ErrorCodes.ErrorInvalidToken.interpret())
346-
return result
330+
user_dn, user_email = self.validate_token(id_token=id_token, action_id=ActionId.query,
331+
resource_type=ResourceType.sliver,
332+
resource_id=str(rid))
333+
334+
if user_email is None:
335+
user_email = email
336+
337+
if user_dn is None:
338+
user_dn = oidc_claim_sub
347339

348340
res_list = None
349341
try:
@@ -383,7 +375,7 @@ def get_reservations(self, *, caller: AuthToken, id_token: str = None, state: in
383375
slice_id = r.get_slice_id()
384376
slice_obj = self.get_slice_by_guid(guid=slice_id)
385377
r.restore(actor=self.actor, slice_obj=slice_obj)
386-
rr = Converter.fill_reservation(reservation=r, full=True, notices_as_dict=notices_as_dict)
378+
rr = Converter.fill_reservation(reservation=r, full=True)
387379
result.reservations.append(rr)
388380
except ReservationNotFoundException as e:
389381
self.logger.error("getReservations: {}".format(e))
@@ -406,12 +398,9 @@ def remove_reservation(self, *, caller: AuthToken, rid: ID, id_token: str = None
406398
return result
407399

408400
try:
409-
if id_token is not None:
410-
AccessChecker.check_access(action_id=ActionId.delete,
411-
resource_type=ResourceType.sliver,
412-
token=id_token, logger=self.logger,
413-
actor_type=self.actor.get_type(),
414-
resource_id=str(rid))
401+
self.validate_token(id_token=id_token, action_id=ActionId.delete,
402+
resource_type=ResourceType.sliver,
403+
resource_id=str(rid))
415404

416405
class Runner(ABCActorRunnable):
417406
def __init__(self, *, actor: ABCActorMixin):
@@ -443,12 +432,9 @@ def close_reservation(self, *, caller: AuthToken, rid: ID, id_token: str = None)
443432
return result
444433

445434
try:
446-
if id_token is not None:
447-
AccessChecker.check_access(action_id=ActionId.close,
448-
resource_type=ResourceType.sliver,
449-
token=id_token, logger=self.logger,
450-
actor_type=self.actor.get_type(),
451-
resource_id=str(rid))
435+
self.validate_token(id_token=id_token, action_id=ActionId.close,
436+
resource_type=ResourceType.sliver,
437+
resource_id=str(rid))
452438

453439
class Runner(ABCActorRunnable):
454440
def __init__(self, *, actor: ABCActorMixin):
@@ -480,12 +466,9 @@ def close_slice_reservations(self, *, caller: AuthToken, slice_id: ID, id_token:
480466
return result
481467

482468
try:
483-
if id_token is not None:
484-
AccessChecker.check_access(action_id=ActionId.close,
485-
resource_type=ResourceType.slice,
486-
token=id_token, logger=self.logger,
487-
actor_type=self.actor.get_type(),
488-
resource_id=str(slice_id))
469+
self.validate_token(id_token=id_token, action_id=ActionId.close,
470+
resource_type=ResourceType.slice,
471+
resource_id=str(slice_id))
489472

490473
class Runner(ABCActorRunnable):
491474
def __init__(self, *, actor: ABCActorMixin):
@@ -580,9 +563,8 @@ def get_reservation_state_for_reservations(self, *, caller: AuthToken, rids: Lis
580563
return result
581564

582565
try:
583-
if id_token is not None:
584-
AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.sliver,
585-
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
566+
self.validate_token(id_token=id_token, action_id=ActionId.query,
567+
resource_type=ResourceType.sliver)
586568

587569
res_list = None
588570
try:
@@ -621,9 +603,9 @@ def get_delegations(self, *, caller: AuthToken, id_token: str = None, slice_id:
621603
return result
622604

623605
try:
624-
if id_token is not None:
625-
AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.delegation,
626-
token=id_token, logger=self.logger, actor_type=self.actor.get_type())
606+
self.validate_token(id_token=id_token, action_id=ActionId.query,
607+
resource_type=ResourceType.delegation)
608+
627609
dlg_list = None
628610
try:
629611
if did is not None:

0 commit comments

Comments
 (0)