Coverage for dj/api/namespaces.py: 100%
25 statements
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-17 20:05 -0700
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-17 20:05 -0700
1"""
2Node namespace related APIs.
3"""
4import logging
5from typing import List
7from fastapi import APIRouter, Depends
8from fastapi.responses import JSONResponse
9from sqlalchemy.orm import joinedload
10from sqlmodel import Session, select
12from dj.api.helpers import get_node_namespace
13from dj.models.node import Node, NodeNamespace, NodeOutput
14from dj.utils import get_session
16_logger = logging.getLogger(__name__)
17router = APIRouter()
20@router.post("/namespaces/{namespace}/", status_code=201)
21def create_a_node_namespace(
22 namespace: str,
23 session: Session = Depends(get_session),
24) -> JSONResponse:
25 """
26 Create a node namespace
27 """
28 if get_node_namespace(
29 session=session,
30 namespace=namespace,
31 raise_if_not_exists=False,
32 ): # pragma: no cover
33 return JSONResponse(
34 status_code=409,
35 content={
36 "message": (f"Node namespace `{namespace}` already exists"),
37 },
38 )
39 node_namespace = NodeNamespace(namespace=namespace)
40 session.add(node_namespace)
41 session.commit()
42 return JSONResponse(
43 status_code=201,
44 content={
45 "message": (f"Node namespace `{namespace}` has been successfully created"),
46 },
47 )
50@router.get(
51 "/namespaces/",
52 response_model=List[NodeNamespace],
53 status_code=200,
54)
55def list_node_namespaces(
56 session: Session = Depends(get_session),
57) -> List[NodeNamespace]:
58 """
59 List node namespaces
60 """
61 namespaces = session.exec(select(NodeNamespace)).all()
62 return namespaces
65@router.get(
66 "/namespaces/{namespace}/",
67 response_model=List[NodeOutput],
68 status_code=200,
69)
70def list_nodes_in_namespace(
71 namespace: str,
72 session: Session = Depends(get_session),
73) -> List[NodeOutput]:
74 """
75 List nodes in namespace
76 """
77 nodes = (
78 session.exec(
79 select(Node)
80 .options(joinedload(Node.current))
81 .where(
82 Node.namespace.like( # type: ignore # pylint: disable=no-member
83 f"{namespace}%",
84 ),
85 ),
86 )
87 .unique()
88 .all()
89 )
90 return nodes # type: ignore