Skip to content

Commit 0810042

Browse files
fixed front tests
1 parent 7b7d003 commit 0810042

File tree

14 files changed

+828
-38
lines changed

14 files changed

+828
-38
lines changed

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ k8s-infra: k8s-network-conf k8s-pgsql k8s-monitoring
111111

112112
k8s-modelplatform: k8s-backend k8s-frontend
113113

114+
k8s-modelplatform-local: k8s-backend-local k8s-frontend-local
115+
114116
dev-back:
115117
uv run python -m backend
116118

backend/api/model_infos_routes.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
# Philippe Stepniewski
22
import inspect
33

4-
from fastapi import APIRouter, Depends, Request
4+
from fastapi import APIRouter, Depends, HTTPException, Request
55
from fastapi.responses import JSONResponse
66

7+
from backend.api.models_routes import get_project_registry_tracking_uri, get_registry_pool
78
from backend.domain.ports.model_info_db_handler import ModelInfoDbHandler
9+
from backend.domain.ports.model_registry import ModelRegistry
10+
from backend.domain.ports.registry_handler import RegistryHandler
811
from backend.domain.ports.user_handler import UserHandler
12+
from backend.domain.use_cases.ai_act_usecases import generate_ai_act_card
913
from backend.domain.use_cases.auth_usecases import get_current_user, get_user_adapter
1014
from backend.domain.use_cases.model_info_usecases import search_model_infos
1115
from backend.domain.use_cases.user_usecases import user_can_perform_action_for_project
@@ -17,6 +21,33 @@ def get_model_info_db_handler(request: Request) -> ModelInfoDbHandler:
1721
return request.app.state.model_info_db_handler
1822

1923

24+
@router.get("/{project_name}/{model_name}/{version}/ai_act_card")
25+
def get_ai_act_card(
26+
project_name: str,
27+
model_name: str,
28+
version: str,
29+
request: Request,
30+
model_info_db_handler: ModelInfoDbHandler = Depends(get_model_info_db_handler),
31+
registry_pool: RegistryHandler = Depends(get_registry_pool),
32+
current_user: dict = Depends(get_current_user),
33+
user_adapter: UserHandler = Depends(get_user_adapter),
34+
) -> JSONResponse:
35+
user_can_perform_action_for_project(
36+
current_user,
37+
project_name=project_name,
38+
action_name=inspect.currentframe().f_code.co_name,
39+
user_adapter=user_adapter,
40+
)
41+
registry: ModelRegistry = registry_pool.get_registry_adapter(
42+
project_name, get_project_registry_tracking_uri(project_name, request)
43+
)
44+
try:
45+
markdown = generate_ai_act_card(registry, model_info_db_handler, project_name, model_name, version)
46+
except Exception as e:
47+
raise HTTPException(status_code=500, detail=str(e))
48+
return JSONResponse(content={"markdown": markdown})
49+
50+
2051
@router.get("/search")
2152
def search(
2253
query: str,

backend/domain/entities/role.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class ProjectRole(Enum):
2121
"list_deployed_models",
2222
"list_model_versions",
2323
"route_list_projects",
24+
"get_ai_act_card",
2425
]
2526
PROJECT_ACTIONS_MINIMUM_LEVEL[ProjectRole.DEVELOPER] = PROJECT_ACTIONS_MINIMUM_LEVEL[ProjectRole.VIEWER] + [
2627
"route_deploy_model",

backend/domain/ports/model_registry.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ def get_model_card(self, model_name: str, version: str) -> str | None:
2424
"""Return the content of model_card.md for the given model version, or None if absent."""
2525
pass
2626

27+
@abstractmethod
28+
def get_model_governance_information(self, model_name: str, version: str) -> dict:
29+
"""Return governance information (run_id, tags, params, metrics) for a model version."""
30+
pass
31+
2732
@abstractmethod
2833
def log_model(self, **kwargs) -> None:
2934
pass

backend/domain/use_cases/projects_usecases.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ def get_project_info(project_db_handler: ProjectDbHandler, project_name: str) ->
3434

3535

3636
def remove_project(project_db_handler: ProjectDbHandler, project_name: str) -> bool:
37-
_remove_project_namespace(project_name)
37+
try:
38+
_remove_project_namespace(project_name)
39+
except Exception as e:
40+
logger.error(f"K8s cleanup failed for project '{project_name}', continuing with DB removal: {e}")
3841
project_db_handler.remove_project(project_name)
3942
return True

backend/infrastructure/k8s_deployment.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,13 @@ def _create_or_update_namespace(self):
3939

4040
def delete_namespace(self):
4141
try:
42-
# Check if the namespace exists
4342
self.service_api_instance.read_namespace(name=self.namespace)
44-
logger.info(f"ℹ️ Namespace {self.namespace} found, deleting resources...")
45-
46-
# Delete all Deployments in the namespace
47-
deployments = self.apps_api_instance.list_namespaced_deployment(namespace=self.namespace)
48-
for deployment in deployments.items:
49-
self.apps_api_instance.delete_namespaced_deployment(
50-
name=deployment.metadata.name, namespace=self.namespace
51-
)
52-
logger.info(f"✅ Deployment {deployment.metadata.name} deleted.")
53-
54-
# Delete all Pods in the namespace
55-
pods = self.service_api_instance.list_namespaced_pod(namespace=self.namespace)
56-
for pod in pods.items:
57-
self.service_api_instance.delete_namespaced_pod(name=pod.metadata.name, namespace=self.namespace)
58-
logger.info(f"✅ Pod {pod.metadata.name} deleted.")
59-
60-
# Delete the namespace after all resources are removed
43+
logger.info(f"ℹ️ Namespace {self.namespace} found, deleting...")
6144
self.service_api_instance.delete_namespace(name=self.namespace)
6245
logger.info(f"✅ Namespace {self.namespace} successfully deleted!")
63-
6446
except ApiException as e:
6547
if e.status == 404:
6648
logger.info(f"ℹ️ Namespace {self.namespace} not found, nothing to delete.")
6749
else:
6850
logger.error(f"⚠️ Error while deleting namespace {self.namespace}: {e}")
51+
raise

0 commit comments

Comments
 (0)