Skip to content

Commit 4203eb7

Browse files
committed
fix: API calls list
Signed-off-by: ntkathole <[email protected]>
1 parent 8f187dd commit 4203eb7

4 files changed

Lines changed: 106 additions & 41 deletions

File tree

‎sdk/python/feast/api/registry/rest/metrics.py‎

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
grpc_call,
1212
paginate_and_sort,
1313
)
14+
from feast.errors import FeastObjectNotFoundException
15+
from feast.permissions.action import AuthzedAction
16+
from feast.permissions.security_manager import assert_permissions
1417
from feast.protos.feast.registry import RegistryServer_pb2
1518

1619

@@ -433,15 +436,21 @@ async def recently_visited(
433436
key = f"recently_visited_{user}"
434437
visits = []
435438
if project:
436-
try:
437-
visits_json = (
438-
server.registry.get_project_metadata(project, key)
439-
if server
440-
else None
441-
)
442-
visits = json.loads(visits_json) if visits_json else []
443-
except Exception:
444-
visits = []
439+
if server:
440+
try:
441+
project_obj = server.registry.get_project(
442+
name=project, allow_cache=True
443+
)
444+
assert_permissions(
445+
resource=project_obj, actions=[AuthzedAction.DESCRIBE]
446+
)
447+
except FeastObjectNotFoundException:
448+
pass
449+
try:
450+
visits_json = server.registry.get_project_metadata(project, key)
451+
visits = json.loads(visits_json) if visits_json else []
452+
except Exception:
453+
visits = []
445454
else:
446455
try:
447456
if server:

‎sdk/python/feast/api/registry/rest/rest_registry_server.py‎

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -235,28 +235,35 @@ async def dispatch(self, request: Request, call_next):
235235
else:
236236
object_type = None
237237
object_name = None
238-
visit = {
239-
"path": path,
240-
"timestamp": _utc_now().isoformat(),
241-
"project": project,
242-
"user": user,
243-
"object": object_type,
244-
"object_name": object_name,
245-
"method": method,
246-
}
247-
try:
248-
visits_json = self.registry.get_project_metadata(project, key)
249-
visits = json.loads(visits_json) if visits_json else []
250-
except Exception:
251-
visits = []
252-
visits.append(visit)
253-
visits = visits[-self.recent_visits_limit :]
254-
try:
255-
self.registry.set_project_metadata(
256-
project, key, json.dumps(visits)
257-
)
258-
except Exception as e:
259-
logger.warning(f"Failed to persist recent visits: {e}")
238+
239+
response = await call_next(request)
240+
241+
if response.status_code < 400:
242+
visit = {
243+
"path": path,
244+
"timestamp": _utc_now().isoformat(),
245+
"project": project,
246+
"user": user,
247+
"object": object_type,
248+
"object_name": object_name,
249+
"method": method,
250+
}
251+
try:
252+
visits_json = self.registry.get_project_metadata(
253+
project, key
254+
)
255+
visits = json.loads(visits_json) if visits_json else []
256+
except Exception:
257+
visits = []
258+
visits.append(visit)
259+
visits = visits[-self.recent_visits_limit :]
260+
try:
261+
self.registry.set_project_metadata(
262+
project, key, json.dumps(visits)
263+
)
264+
except Exception as e:
265+
logger.warning(f"Failed to persist recent visits: {e}")
266+
return response
260267
response = await call_next(request)
261268
return response
262269

‎sdk/python/feast/feature_server.py‎

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,22 @@ async def chat_ui():
584584
@app.post("/materialize", dependencies=[Depends(inject_user_details)])
585585
async def materialize(request: MaterializeRequest) -> None:
586586
with feast_metrics.track_request_latency("/materialize"):
587-
for feature_view in request.feature_views or []:
588-
resource = await _get_feast_object(feature_view, True)
589-
assert_permissions(
590-
resource=resource,
591-
actions=[AuthzedAction.WRITE_ONLINE],
587+
if request.feature_views:
588+
for feature_view in request.feature_views:
589+
resource = await _get_feast_object(feature_view, True)
590+
assert_permissions(
591+
resource=resource,
592+
actions=[AuthzedAction.WRITE_ONLINE],
593+
)
594+
else:
595+
feature_views_to_materialize = store._get_feature_views_to_materialize(
596+
None
592597
)
598+
for fv in feature_views_to_materialize:
599+
assert_permissions(
600+
resource=fv,
601+
actions=[AuthzedAction.WRITE_ONLINE],
602+
)
593603

594604
if request.disable_event_timestamp:
595605
now = datetime.now()
@@ -615,12 +625,22 @@ async def materialize(request: MaterializeRequest) -> None:
615625
@app.post("/materialize-incremental", dependencies=[Depends(inject_user_details)])
616626
async def materialize_incremental(request: MaterializeIncrementalRequest) -> None:
617627
with feast_metrics.track_request_latency("/materialize-incremental"):
618-
for feature_view in request.feature_views or []:
619-
resource = await _get_feast_object(feature_view, True)
620-
assert_permissions(
621-
resource=resource,
622-
actions=[AuthzedAction.WRITE_ONLINE],
628+
if request.feature_views:
629+
for feature_view in request.feature_views:
630+
resource = await _get_feast_object(feature_view, True)
631+
assert_permissions(
632+
resource=resource,
633+
actions=[AuthzedAction.WRITE_ONLINE],
634+
)
635+
else:
636+
feature_views_to_materialize = store._get_feature_views_to_materialize(
637+
None
623638
)
639+
for fv in feature_views_to_materialize:
640+
assert_permissions(
641+
resource=fv,
642+
actions=[AuthzedAction.WRITE_ONLINE],
643+
)
624644
await run_in_threadpool(
625645
store.materialize_incremental,
626646
utils.make_tzaware(parser.parse(request.end_ts)),

‎sdk/python/feast/registry_server.py‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,13 @@ def DeleteValidationReference(
891891
def ListProjectMetadata(
892892
self, request: RegistryServer_pb2.ListProjectMetadataRequest, context
893893
):
894+
try:
895+
project = self.proxied_registry.get_project(
896+
name=request.project, allow_cache=True
897+
)
898+
assert_permissions(resource=project, actions=[AuthzedAction.DESCRIBE])
899+
except FeastObjectNotFoundException:
900+
pass
894901
return RegistryServer_pb2.ListProjectMetadataResponse(
895902
project_metadata=[
896903
project_metadata.to_proto()
@@ -923,6 +930,10 @@ def ApplyMaterialization(
923930
return Empty()
924931

925932
def UpdateInfra(self, request: RegistryServer_pb2.UpdateInfraRequest, context):
933+
project = self.proxied_registry.get_project(
934+
name=request.project, allow_cache=True
935+
)
936+
assert_permissions(resource=project, actions=[AuthzedAction.UPDATE])
926937
self.proxied_registry.update_infra(
927938
infra=Infra.from_proto(request.infra),
928939
project=request.project,
@@ -931,6 +942,10 @@ def UpdateInfra(self, request: RegistryServer_pb2.UpdateInfraRequest, context):
931942
return Empty()
932943

933944
def GetInfra(self, request: RegistryServer_pb2.GetInfraRequest, context):
945+
project = self.proxied_registry.get_project(
946+
name=request.project, allow_cache=True
947+
)
948+
assert_permissions(resource=project, actions=[AuthzedAction.DESCRIBE])
934949
return self.proxied_registry.get_infra(
935950
project=request.project, allow_cache=request.allow_cache
936951
).to_proto()
@@ -1063,6 +1078,13 @@ def DeleteProject(self, request: RegistryServer_pb2.DeleteProjectRequest, contex
10631078
def GetRegistryLineage(
10641079
self, request: RegistryServer_pb2.GetRegistryLineageRequest, context
10651080
):
1081+
try:
1082+
project = self.proxied_registry.get_project(
1083+
name=request.project, allow_cache=True
1084+
)
1085+
assert_permissions(resource=project, actions=[AuthzedAction.DESCRIBE])
1086+
except FeastObjectNotFoundException:
1087+
pass
10661088
direct_relationships, indirect_relationships = (
10671089
self.proxied_registry.get_registry_lineage(
10681090
project=request.project,
@@ -1101,6 +1123,13 @@ def GetObjectRelationships(
11011123
self, request: RegistryServer_pb2.GetObjectRelationshipsRequest, context
11021124
):
11031125
"""Get relationships for a specific object."""
1126+
try:
1127+
project = self.proxied_registry.get_project(
1128+
name=request.project, allow_cache=True
1129+
)
1130+
assert_permissions(resource=project, actions=[AuthzedAction.DESCRIBE])
1131+
except FeastObjectNotFoundException:
1132+
pass
11041133
relationships = self.proxied_registry.get_object_relationships(
11051134
project=request.project,
11061135
object_type=request.object_type,

0 commit comments

Comments
 (0)