Skip to content

Commit 25f5286

Browse files
part 1 endpoint generation/ basic request coverage
1 parent 02829b4 commit 25f5286

17 files changed

Lines changed: 948 additions & 2 deletions

conSys/capabilities.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from pydantic import HttpUrl
2+
3+
from conSys.con_sys_api import ConnectedSystemsRequestBuilder
4+
from conSys.constants import APITerms
5+
6+
7+
def get_landing_page(server_addr: HttpUrl, api_root: str = APITerms.API.value):
8+
"""
9+
Returns the landing page of the API
10+
:return:
11+
"""
12+
builder = ConnectedSystemsRequestBuilder()
13+
api_request = (builder.with_server_url(server_addr)
14+
.with_api_root(api_root)
15+
.build_url_from_base()
16+
.build())
17+
return api_request
18+
19+
20+
def get_conformance_info(server_addr: HttpUrl, api_root: str = APITerms.API.value):
21+
"""
22+
Returns the conformance information of the API
23+
:return:
24+
"""
25+
builder = ConnectedSystemsRequestBuilder()
26+
api_request = (builder.with_server_url(server_addr)
27+
.with_api_root(api_root)
28+
.for_resource_type(APITerms.CONFORMANCE.value)
29+
.build_url_from_base()
30+
.build())
31+
return api_request

conSys/collections.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from pydantic import HttpUrl
2+
3+
from conSys.con_sys_api import ConnectedSystemsRequestBuilder
4+
from conSys.constants import APITerms
5+
6+
7+
def list_all_collections(server_addr: HttpUrl, api_root: str = APITerms.API.value):
8+
"""
9+
List all collections
10+
:return:
11+
"""
12+
builder = ConnectedSystemsRequestBuilder()
13+
api_request = (builder.with_server_url(server_addr)
14+
.with_api_root(api_root)
15+
.for_resource_type(APITerms.COLLECTIONS.value)
16+
.build_url_from_base()
17+
.build())
18+
return api_request
19+
20+
21+
def retrieve_collection_metadata(server_addr: HttpUrl, collection_id: str, api_root: str = APITerms.API.value):
22+
"""
23+
Retrieve a collection by its ID
24+
:return:
25+
"""
26+
builder = ConnectedSystemsRequestBuilder()
27+
api_request = (builder.with_server_url(server_addr)
28+
.with_api_root(api_root)
29+
.for_resource_type(APITerms.COLLECTIONS.value)
30+
.with_resource_id(collection_id)
31+
.build_url_from_base()
32+
.build())
33+
return api_request
34+
35+
36+
def list_all_items_in_collection(server_addr: HttpUrl, collection_id: str, api_root: str = APITerms.API.value):
37+
"""
38+
Lists all systems in the server at the default API endpoint
39+
:return:
40+
"""
41+
builder = ConnectedSystemsRequestBuilder()
42+
api_request = (builder.with_server_url(server_addr)
43+
.with_api_root(api_root)
44+
.for_resource_type(APITerms.COLLECTIONS.value)
45+
.with_resource_id(collection_id)
46+
.for_sub_resource_type(APITerms.ITEMS.value)
47+
.build_url_from_base()
48+
.build())
49+
return api_request
50+
51+
52+
def retrieve_collection_item_by_id(server_addr: HttpUrl, collection_id: str, item_id: str,
53+
api_root: str = APITerms.API.value):
54+
"""
55+
Retrieves a system by its id
56+
:return:
57+
"""
58+
builder = ConnectedSystemsRequestBuilder()
59+
api_request = (builder.with_server_url(server_addr)
60+
.with_api_root(api_root)
61+
.for_resource_type(APITerms.COLLECTIONS.value)
62+
.with_resource_id(collection_id)
63+
.for_sub_resource_type(APITerms.ITEMS.value)
64+
.with_resource_id(item_id)
65+
.build_url_from_base()
66+
.build())
67+
return api_request

conSys/con_sys_api.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from pydantic import BaseModel, HttpUrl
2+
3+
from conSys.endpoints.endpoints import Endpoint
4+
from conSys.request_bodies import RequestBody
5+
6+
7+
class ConnectedSystemAPIRequest(BaseModel):
8+
url: HttpUrl
9+
request_body: RequestBody
10+
11+
12+
class ConnectedSystemsRequestBuilder(BaseModel):
13+
api_request: ConnectedSystemAPIRequest
14+
base_url: HttpUrl
15+
endpoint: Endpoint
16+
17+
def with_api_url(self, url: HttpUrl):
18+
self.api_request.url = url
19+
return self
20+
21+
def with_server_url(self, server_url: HttpUrl):
22+
self.base_url = server_url
23+
return self
24+
25+
def build_url_from_base(self):
26+
"""
27+
Builds the full API endpoint URL from the base URL and the endpoint parameters that have been previously
28+
provided.
29+
"""
30+
self.api_request.url = f'{self.base_url}/{self.endpoint.create_endpoint()}'
31+
return self
32+
33+
def with_api_root(self, api_root: str):
34+
"""
35+
Optional: Set the API root for the request. This is useful if you want to use a different API root than the
36+
default one (api).
37+
:param api_root:
38+
:return:
39+
"""
40+
self.endpoint.api_root = api_root
41+
return self
42+
43+
def for_resource_type(self, resource_type: str):
44+
self.endpoint.base_resource = resource_type
45+
return self
46+
47+
def with_resource_id(self, resource_id: str):
48+
self.endpoint.resource_id = resource_id
49+
return self
50+
51+
def for_sub_resource_type(self, sub_resource_type: str):
52+
self.endpoint.sub_component = sub_resource_type
53+
return self
54+
55+
def with_secondary_resource_id(self, resource_id: str):
56+
self.endpoint.secondary_resource_id = resource_id
57+
return self
58+
59+
def with_request_body(self, request_body: RequestBody):
60+
self.api_request.request_body = request_body
61+
return self
62+
63+
def build(self):
64+
# convert endpoint to HttpUrl
65+
return self.api_request
66+
67+
def reset(self):
68+
self.api_request = ConnectedSystemAPIRequest()
69+
self.endpoint = Endpoint()
70+
return self

conSys/constants.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ class APITerms(Enum):
1515
PROCEDURES = 'procedures'
1616
DEPLOYMENTS = 'deployments'
1717
PROPERTIES = 'properties'
18+
UNDEFINED = ''
19+
COLLECTIONS = 'collections'
20+
ITEMS = 'items'
21+
COMPONENTS = 'components'
22+
CONFORMANCE = 'conformance'
1823

1924

2025
class SystemTypes(Enum):
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from pydantic import BaseModel, HttpUrl
2+
3+
4+
class NetworkProperties(BaseModel):
5+
endpoint_url: HttpUrl
6+
tls: bool = False
7+
stream_protocol: str = 'ws'
8+
mqtt_opts: dict = None
9+
mqtt_endpoint_url: HttpUrl = None
10+
connector_opts: dict = None

conSys/datamodels/query.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from pydantic import BaseModel
2+
3+
class Query(BaseModel):
4+
query: str
5+
params: dict = None

conSys/deployments.py

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
from pydantic import HttpUrl
2+
3+
from conSys.con_sys_api import ConnectedSystemsRequestBuilder
4+
from conSys.constants import APITerms
5+
6+
7+
def list_all_deployments(server_addr: HttpUrl, api_root: str = APITerms.API.value):
8+
"""
9+
Lists all deployments in the server at the default API endpoint
10+
:return:
11+
"""
12+
builder = ConnectedSystemsRequestBuilder()
13+
api_request = (builder.with_server_url(server_addr)
14+
.with_api_root(api_root)
15+
.for_resource_type(APITerms.DEPLOYMENTS.value)
16+
.build_url_from_base()
17+
.build())
18+
return api_request
19+
20+
21+
def create_new_deployments(server_addr: HttpUrl, request_body: dict, api_root: str = APITerms.API.value):
22+
"""
23+
Create a new deployment as defined by the request body
24+
:return:
25+
"""
26+
builder = ConnectedSystemsRequestBuilder()
27+
api_request = (builder.with_server_url(server_addr)
28+
.with_api_root(api_root)
29+
.for_resource_type(APITerms.DEPLOYMENTS.value)
30+
.with_request_body(request_body)
31+
.build_url_from_base()
32+
.build())
33+
return api_request
34+
35+
36+
def retrieve_deployment_by_id(server_addr: HttpUrl, deployment_id: str, api_root: str = APITerms.API.value):
37+
"""
38+
Retrieve a deployment by its ID
39+
:return:
40+
"""
41+
builder = ConnectedSystemsRequestBuilder()
42+
api_request = (builder.with_server_url(server_addr)
43+
.with_api_root(api_root)
44+
.for_resource_type(APITerms.DEPLOYMENTS.value)
45+
.with_resource_id(deployment_id)
46+
.build_url_from_base()
47+
.build())
48+
return api_request
49+
50+
51+
def update_deployment_by_id(server_addr: HttpUrl, deployment_id: str, request_body: dict,
52+
api_root: str = APITerms.API.value):
53+
"""
54+
Update a deployment by its ID
55+
:return:
56+
"""
57+
builder = ConnectedSystemsRequestBuilder()
58+
api_request = (builder.with_server_url(server_addr)
59+
.with_api_root(api_root)
60+
.for_resource_type(APITerms.DEPLOYMENTS.value)
61+
.with_resource_id(deployment_id)
62+
.with_request_body(request_body)
63+
.build_url_from_base()
64+
.build())
65+
return api_request
66+
67+
68+
def delete_deployment_by_id(server_addr: HttpUrl, deployment_id: str, api_root: str = APITerms.API.value):
69+
"""
70+
Delete a deployment by its ID
71+
:return:
72+
"""
73+
builder = ConnectedSystemsRequestBuilder()
74+
api_request = (builder.with_server_url(server_addr)
75+
.with_api_root(api_root)
76+
.for_resource_type(APITerms.DEPLOYMENTS.value)
77+
.with_resource_id(deployment_id)
78+
.build_url_from_base()
79+
.build())
80+
return api_request
81+
82+
83+
def list_deployed_systems(server_addr: HttpUrl, deployment_id, api_root: str = APITerms.API.value):
84+
"""
85+
Lists all deployed systems in the server at the default API endpoint
86+
:return:
87+
"""
88+
builder = ConnectedSystemsRequestBuilder()
89+
api_request = (builder.with_server_url(server_addr)
90+
.with_api_root(api_root)
91+
.for_resource_type(APITerms.DEPLOYMENTS.value)
92+
.with_resource_id(deployment_id)
93+
.for_sub_resource_type(APITerms.SYSTEMS.value)
94+
.build_url_from_base()
95+
.build())
96+
return api_request
97+
98+
99+
def add_systems_to_deployment(server_addr: HttpUrl, deployment_id: str, uri_list: str,
100+
api_root: str = APITerms.API.value):
101+
"""
102+
Lists all systems in the server at the default API endpoint
103+
:return:
104+
"""
105+
builder = ConnectedSystemsRequestBuilder()
106+
api_request = (builder.with_server_url(server_addr)
107+
.with_api_root(api_root)
108+
.for_resource_type(APITerms.DEPLOYMENTS.value)
109+
.with_resource_id(deployment_id)
110+
.for_sub_resource_type(APITerms.SYSTEMS.value)
111+
.with_request_body(uri_list)
112+
.build_url_from_base()
113+
.build())
114+
return api_request
115+
116+
117+
def retrieve_deployed_system_by_id(server_addr: HttpUrl, deployment_id: str, system_id: str,
118+
api_root: str = APITerms.API.value):
119+
"""
120+
Retrieves a system by its id
121+
:return:
122+
"""
123+
124+
# TODO: Add a way to have a secondary resource ID for certain endpoints
125+
builder = ConnectedSystemsRequestBuilder()
126+
api_request = (builder.with_server_url(server_addr)
127+
.with_api_root(api_root)
128+
.for_resource_type(APITerms.DEPLOYMENTS.value)
129+
.with_resource_id(deployment_id)
130+
.for_sub_resource_type(APITerms.SYSTEMS.value)
131+
.with_secondary_resource_id(system_id)
132+
.build_url_from_base()
133+
.build())
134+
return api_request
135+
136+
137+
def update_deployed_system_by_id(server_addr: HttpUrl, deployment_id: str, system_id: str, request_body: dict,
138+
api_root: str = APITerms.API.value):
139+
"""
140+
Update a system by its ID
141+
:return:
142+
"""
143+
builder = ConnectedSystemsRequestBuilder()
144+
api_request = (builder.with_server_url(server_addr)
145+
.with_api_root(api_root)
146+
.for_resource_type(APITerms.DEPLOYMENTS.value)
147+
.with_resource_id(deployment_id)
148+
.for_sub_resource_type(APITerms.SYSTEMS.value)
149+
.with_secondary_resource_id(system_id)
150+
.with_request_body(request_body)
151+
.build_url_from_base()
152+
.build())
153+
154+
return api_request
155+
156+
157+
def delete_deployed_system_by_id(server_addr: HttpUrl, deployment_id: str, system_id: str,
158+
api_root: str = APITerms.API.value):
159+
"""
160+
Delete a system by its ID
161+
:return:
162+
"""
163+
builder = ConnectedSystemsRequestBuilder()
164+
api_request = (builder.with_server_url(server_addr)
165+
.with_api_root(api_root)
166+
.for_resource_type(APITerms.DEPLOYMENTS.value)
167+
.with_resource_id(deployment_id)
168+
.for_sub_resource_type(APITerms.SYSTEMS.value)
169+
.with_secondary_resource_id(system_id)
170+
.build_url_from_base()
171+
.build())
172+
return api_request
173+
174+
175+
def list_deployments_of_specific_system(server_addr: HttpUrl, system_id: str, api_root: str = APITerms.API.value):
176+
"""
177+
Lists all deployments of a specific system in the server at the default API endpoint
178+
:return:
179+
"""
180+
builder = ConnectedSystemsRequestBuilder()
181+
api_request = (builder.with_server_url(server_addr)
182+
.with_api_root(api_root)
183+
.for_resource_type(APITerms.SYSTEMS.value)
184+
.with_resource_id(system_id)
185+
.for_sub_resource_type(APITerms.DEPLOYMENTS.value)
186+
.build_url_from_base()
187+
.build())

0 commit comments

Comments
 (0)