Skip to content

Commit 80fb583

Browse files
reorganize to move datamodel for Node into the correct file
1 parent d62e7db commit 80fb583

4 files changed

Lines changed: 93 additions & 77 deletions

File tree

oshconnect/__init__.py

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
import base64
99
import uuid
1010
from abc import ABC
11-
from dataclasses import dataclass
11+
from dataclasses import dataclass, field
1212
from enum import Enum
1313
import swecommondm as swe_common
1414
from conSys4Py import APIResourceTypes
1515
from conSys4Py.core.default_api_helpers import APIHelper
1616

17+
from external_models.object_models import System as SystemResource
18+
1719

1820
@dataclass(kw_only=True)
1921
class Endpoints:
@@ -22,55 +24,6 @@ class Endpoints:
2224
connected_systems: str = f"{root}/api"
2325

2426

25-
@dataclass(kw_only=True)
26-
class Node:
27-
_id: str
28-
address: str
29-
port: int
30-
endpoints: Endpoints
31-
is_secure: bool
32-
_basic_auth: bytes = None
33-
_api_helper: APIHelper
34-
35-
def __init__(self, address: str, port: int, username: str = None, password: str = None, **kwargs: dict):
36-
self._id = f'node-{uuid.uuid4()}'
37-
self.address = address
38-
self.port = port
39-
self.is_secure = username is not None and password is not None
40-
if self.is_secure:
41-
self.add_basicauth(username, password)
42-
self.endpoints = Endpoints()
43-
self._api_helper = APIHelper(server_url=f'{self.address}:{self.port}',
44-
api_root=self.endpoints.connected_systems, username=username, password=password)
45-
if self.is_secure:
46-
self._api_helper.user_auth = True
47-
48-
def get_id(self):
49-
return self._id
50-
51-
def get_address(self):
52-
return self.address
53-
54-
def get_port(self):
55-
return self.port
56-
57-
def get_api_endpoint(self):
58-
return f"http{'s' if self.is_secure else ''}://{self.address}:{self.port}/{self.endpoints.connected_systems}"
59-
60-
def add_basicauth(self, username: str, password: str):
61-
if not self.is_secure:
62-
self.is_secure = True
63-
self._basic_auth = base64.b64encode(f"{username}:{password}".encode('utf-8'))
64-
65-
def get_decoded_auth(self):
66-
return self._basic_auth.decode('utf-8')
67-
68-
def discover_systems(self):
69-
res = self._api_helper.retrieve_resource(APIResourceTypes.SYSTEM, req_headers={})
70-
if res.ok:
71-
return res.json()
72-
else:
73-
return None
7427

7528

7629
class TemporalModes(Enum):

oshconnect/datamodels/datamodels.py

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,81 @@
66
# ==============================================================================
77
from __future__ import annotations
88

9+
import base64
910
import uuid
11+
from dataclasses import dataclass, field
12+
13+
from conSys4Py import APIResourceTypes
14+
from conSys4Py.core.default_api_helpers import APIHelper
1015

11-
from oshconnect import Node
1216
from external_models.object_models import System as SystemResource
17+
from oshconnect import Endpoints
18+
19+
20+
@dataclass(kw_only=True)
21+
class Node:
22+
_id: str
23+
address: str
24+
port: int
25+
endpoints: Endpoints
26+
is_secure: bool
27+
_basic_auth: bytes = None
28+
_api_helper: APIHelper
29+
_system_ids: list[uuid] = field(default_factory=list)
30+
31+
def __init__(self, address: str, port: int, username: str = None, password: str = None, **kwargs: dict):
32+
self._id = f'node-{uuid.uuid4()}'
33+
self.address = address
34+
self.port = port
35+
self.is_secure = username is not None and password is not None
36+
if self.is_secure:
37+
self.add_basicauth(username, password)
38+
self.endpoints = Endpoints()
39+
self._api_helper = APIHelper(server_url=f'{self.address}:{self.port}',
40+
api_root=self.endpoints.connected_systems, username=username, password=password)
41+
if self.is_secure:
42+
self._api_helper.user_auth = True
43+
self._system_ids = []
44+
45+
def get_id(self):
46+
return self._id
47+
48+
def get_address(self):
49+
return self.address
50+
51+
def get_port(self):
52+
return self.port
53+
54+
def get_api_endpoint(self):
55+
return f"http{'s' if self.is_secure else ''}://{self.address}:{self.port}/{self.endpoints.connected_systems}"
56+
57+
def add_basicauth(self, username: str, password: str):
58+
if not self.is_secure:
59+
self.is_secure = True
60+
self._basic_auth = base64.b64encode(f"{username}:{password}".encode('utf-8'))
61+
62+
def get_decoded_auth(self):
63+
return self._basic_auth.decode('utf-8')
64+
65+
def discover_systems(self):
66+
result = self._api_helper.retrieve_resource(APIResourceTypes.SYSTEM, req_headers={})
67+
if result.ok:
68+
new_systems = []
69+
system_objs = result.json()['items']
70+
print(system_objs)
71+
for system_json in system_objs:
72+
print(system_json)
73+
system = SystemResource.model_validate(system_json)
74+
sys_obj = System.from_system_resource(system)
75+
sys_obj.update_parent_node(self)
76+
self._system_ids.append(sys_obj.uid)
77+
new_systems.append(sys_obj)
78+
return new_systems
79+
else:
80+
return None
81+
82+
def add_new_system(self, system: System):
83+
self._system_ids.append(system.uid)
1384

1485

1586
class System:
@@ -33,8 +104,15 @@ def update_parent_node(self, node: Node):
33104

34105
@staticmethod
35106
def from_system_resource(system_resource: SystemResource):
36-
other_props = SystemResource.__dict__
37-
return System(name=system_resource.name, label=system_resource.label)
107+
other_props = system_resource.dict()
108+
print(f'Props of SystemResource: {other_props}')
109+
110+
# case 1: has properties a la geojson
111+
if 'properties' in other_props:
112+
new_system = System(name=other_props['properties']['name'], label=other_props['properties']['name'])
113+
else:
114+
new_system = System(name=system_resource.name, label=system_resource.label)
115+
return new_system
38116

39117

40118
class Datastream:

oshconnect/oshconnect.py

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@
55
# Contact email: ian@botts-inc.com
66
# ==============================================================================
77

8-
from conSys4Py.con_sys_api import ConnectedSystemsRequestBuilder, ConnectedSystemAPIRequest
98
from conSys4Py.core.default_api_helpers import APIHelper
10-
from conSys4Py.part_1 import systems
119

12-
from external_models.object_models import System
13-
from oshconnect import Node
10+
from oshconnect.datamodels.datamodels import Node, System
1411
from oshconnect.datasource.datasource import DataSource
12+
from oshconnect.datastore.datastore import DataStore
1513
from oshconnect.styling.styling import Styling
1614
from oshconnect.timemanagement.timemanagement import TimeManagement
17-
from oshconnect.datastore.datastore import DataStore
1815

1916

2017
class OSHConnect:
@@ -24,6 +21,7 @@ class OSHConnect:
2421
styling: Styling = None
2522
timestream: TimeManagement = None
2623
_nodes: list[Node] = []
24+
_systems: list[System] = []
2725
_cs_api_builder: APIHelper = None
2826
_datafeeds: list[DataSource] = []
2927
_datataskers: list[DataStore] = []
@@ -94,21 +92,9 @@ def discover_systems(self, nodes: list[str] = None):
9492
if nodes is not None:
9593
search_nodes = [node for node in search_nodes if node.get_id() in nodes]
9694

97-
results = []
9895
for node in search_nodes:
99-
result = node.discover_systems()
100-
print(f'Result: {result}')
101-
results.append(result)
102-
103-
new_systems = []
104-
# convert results of conceptual system objects
105-
for result in results:
106-
for system_json in result['items']:
107-
print(system_json)
108-
system = System.model_validate(system_json)
109-
new_systems.append(system)
110-
111-
return new_systems
96+
res_systems = node.discover_systems()
97+
self._systems.extend(res_systems)
11298

11399
def discover_controlstreams(self, streams: list):
114100
pass

tests/test_oshconnect.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# ==============================================================================
32
# Copyright (c) 2024 Botts Innovative Research, Inc.
43
# Date: 2024/5/28
@@ -9,7 +8,7 @@
98
import pytest
109

1110
from oshconnect.oshconnect import OSHConnect
12-
from oshconnect import Node
11+
from oshconnect.datamodels.datamodels import Node, System
1312

1413

1514
class TestOSHConnect:
@@ -29,10 +28,10 @@ def test_oshconnect_add_node(self):
2928

3029
def test_find_systems(self):
3130
app = OSHConnect(name="Test OSH Connect")
32-
node = Node(address="http://localhost", port=8585, is_secure=True, username="admin", password="admin")
31+
node = Node(address="http://localhost", port=8585, username="admin", password="admin")
3332
# node.add_basicauth("admin", "admin")
3433
app.add_node(node)
35-
systems = app.discover_systems()
36-
print(systems)
34+
app.discover_systems()
35+
print(f'Found systems: {app._systems}')
3736
# assert len(systems) == 1
3837
# assert systems[0] == node.get_api_endpoint()

0 commit comments

Comments
 (0)