wnm 0.0.9__py3-none-any.whl → 0.0.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of wnm might be problematic. Click here for more details.
- wnm/__init__.py +1 -1
- wnm/__main__.py +184 -1133
- wnm/actions.py +45 -0
- wnm/common.py +21 -0
- wnm/config.py +653 -1
- wnm/decision_engine.py +388 -0
- wnm/executor.py +1292 -0
- wnm/firewall/__init__.py +13 -0
- wnm/firewall/base.py +71 -0
- wnm/firewall/factory.py +95 -0
- wnm/firewall/null_firewall.py +71 -0
- wnm/firewall/ufw_manager.py +118 -0
- wnm/migration.py +42 -0
- wnm/models.py +305 -126
- wnm/process_managers/__init__.py +23 -0
- wnm/process_managers/base.py +203 -0
- wnm/process_managers/docker_manager.py +371 -0
- wnm/process_managers/factory.py +83 -0
- wnm/process_managers/launchd_manager.py +592 -0
- wnm/process_managers/setsid_manager.py +340 -0
- wnm/process_managers/systemd_manager.py +443 -0
- wnm/reports.py +286 -0
- wnm/utils.py +403 -0
- wnm-0.0.10.dist-info/METADATA +316 -0
- wnm-0.0.10.dist-info/RECORD +28 -0
- {wnm-0.0.9.dist-info → wnm-0.0.10.dist-info}/WHEEL +1 -1
- wnm-0.0.9.dist-info/METADATA +0 -95
- wnm-0.0.9.dist-info/RECORD +0 -9
- {wnm-0.0.9.dist-info → wnm-0.0.10.dist-info}/entry_points.txt +0 -0
- {wnm-0.0.9.dist-info → wnm-0.0.10.dist-info}/top_level.txt +0 -0
wnm/models.py
CHANGED
|
@@ -4,6 +4,7 @@ from typing import Optional
|
|
|
4
4
|
import json_fix
|
|
5
5
|
from sqlalchemy import (
|
|
6
6
|
Float,
|
|
7
|
+
ForeignKey,
|
|
7
8
|
Integer,
|
|
8
9
|
Unicode,
|
|
9
10
|
UnicodeText,
|
|
@@ -16,6 +17,7 @@ from sqlalchemy.orm import (
|
|
|
16
17
|
DeclarativeBase,
|
|
17
18
|
Mapped,
|
|
18
19
|
mapped_column,
|
|
20
|
+
relationship,
|
|
19
21
|
scoped_session,
|
|
20
22
|
sessionmaker,
|
|
21
23
|
)
|
|
@@ -28,149 +30,291 @@ class Base(DeclarativeBase):
|
|
|
28
30
|
|
|
29
31
|
# Extend the Base class to create our Host info
|
|
30
32
|
class Machine(Base):
|
|
33
|
+
"""One row per wnm instance (single physical machine)"""
|
|
34
|
+
|
|
31
35
|
__tablename__ = "machine"
|
|
32
36
|
# No schema in sqlite3
|
|
33
37
|
# __table_args__ = {"schema": "colony"}
|
|
34
38
|
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
39
|
+
|
|
40
|
+
# System configuration
|
|
41
|
+
cpu_count: Mapped[int] = mapped_column(Integer)
|
|
42
|
+
node_cap: Mapped[int] = mapped_column(Integer)
|
|
43
|
+
|
|
44
|
+
# Resource thresholds for adding nodes
|
|
45
|
+
cpu_less_than: Mapped[int] = mapped_column(Integer)
|
|
46
|
+
mem_less_than: Mapped[int] = mapped_column(Integer)
|
|
47
|
+
hd_less_than: Mapped[int] = mapped_column(Integer)
|
|
48
|
+
hdio_read_less_than: Mapped[int] = mapped_column(Integer)
|
|
49
|
+
hdio_write_less_than: Mapped[int] = mapped_column(Integer)
|
|
50
|
+
netio_read_less_than: Mapped[int] = mapped_column(Integer)
|
|
51
|
+
netio_write_less_than: Mapped[int] = mapped_column(Integer)
|
|
52
|
+
|
|
53
|
+
# Resource thresholds for removing nodes
|
|
54
|
+
cpu_remove: Mapped[int] = mapped_column(Integer)
|
|
55
|
+
mem_remove: Mapped[int] = mapped_column(Integer)
|
|
56
|
+
hd_remove: Mapped[int] = mapped_column(Integer)
|
|
57
|
+
hdio_read_remove: Mapped[int] = mapped_column(Integer)
|
|
58
|
+
hdio_write_remove: Mapped[int] = mapped_column(Integer)
|
|
59
|
+
netio_read_remove: Mapped[int] = mapped_column(Integer)
|
|
60
|
+
netio_write_remove: Mapped[int] = mapped_column(Integer)
|
|
61
|
+
|
|
62
|
+
# Load average thresholds
|
|
63
|
+
max_load_average_allowed: Mapped[float] = mapped_column(Float)
|
|
64
|
+
desired_load_average: Mapped[float] = mapped_column(Float)
|
|
65
|
+
|
|
66
|
+
# Delay timers (in seconds, changed from minutes)
|
|
67
|
+
delay_start: Mapped[int] = mapped_column(Integer)
|
|
68
|
+
delay_upgrade: Mapped[int] = mapped_column(Integer)
|
|
69
|
+
delay_remove: Mapped[int] = mapped_column(Integer)
|
|
70
|
+
|
|
71
|
+
# Node configuration
|
|
72
|
+
node_storage: Mapped[str] = mapped_column(UnicodeText)
|
|
73
|
+
rewards_address: Mapped[str] = mapped_column(UnicodeText)
|
|
74
|
+
donate_address: Mapped[str] = mapped_column(UnicodeText)
|
|
75
|
+
|
|
76
|
+
# Port configuration
|
|
77
|
+
port_start: Mapped[int] = mapped_column(Integer)
|
|
78
|
+
metrics_port_start: Mapped[int] = mapped_column(Integer)
|
|
79
|
+
|
|
80
|
+
# System state
|
|
81
|
+
last_stopped_at: Mapped[int] = mapped_column(Integer)
|
|
82
|
+
host: Mapped[str] = mapped_column(UnicodeText)
|
|
83
|
+
crisis_bytes: Mapped[int] = mapped_column(Integer)
|
|
84
|
+
|
|
85
|
+
# Runtime configuration
|
|
86
|
+
environment: Mapped[Optional[str]] = mapped_column(UnicodeText)
|
|
87
|
+
start_args: Mapped[Optional[str]] = mapped_column(UnicodeText)
|
|
88
|
+
|
|
89
|
+
# NEW: Concurrency limits (Phase 5)
|
|
90
|
+
max_concurrent_upgrades: Mapped[int] = mapped_column(Integer, default=1)
|
|
91
|
+
max_concurrent_starts: Mapped[int] = mapped_column(Integer, default=2)
|
|
92
|
+
max_concurrent_removals: Mapped[int] = mapped_column(Integer, default=1)
|
|
93
|
+
|
|
94
|
+
# NEW: Node selection strategy (Phase 6)
|
|
95
|
+
node_removal_strategy: Mapped[str] = mapped_column(
|
|
96
|
+
UnicodeText, default="youngest"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Relationships
|
|
100
|
+
containers: Mapped[list["Container"]] = relationship(
|
|
101
|
+
back_populates="machine", cascade="all, delete-orphan"
|
|
102
|
+
)
|
|
103
|
+
nodes: Mapped[list["Node"]] = relationship(
|
|
104
|
+
back_populates="machine", cascade="all, delete-orphan"
|
|
105
|
+
)
|
|
62
106
|
|
|
63
107
|
def __init__(
|
|
64
108
|
self,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
109
|
+
cpu_count,
|
|
110
|
+
node_cap,
|
|
111
|
+
cpu_less_than,
|
|
112
|
+
cpu_remove,
|
|
113
|
+
mem_less_than,
|
|
114
|
+
mem_remove,
|
|
115
|
+
hd_less_than,
|
|
116
|
+
hd_remove,
|
|
117
|
+
delay_start,
|
|
118
|
+
delay_upgrade,
|
|
119
|
+
delay_remove,
|
|
120
|
+
node_storage,
|
|
121
|
+
rewards_address,
|
|
122
|
+
donate_address,
|
|
123
|
+
max_load_average_allowed,
|
|
124
|
+
desired_load_average,
|
|
125
|
+
port_start,
|
|
126
|
+
hdio_read_less_than,
|
|
127
|
+
hdio_read_remove,
|
|
128
|
+
hdio_write_less_than,
|
|
129
|
+
hdio_write_remove,
|
|
130
|
+
netio_read_less_than,
|
|
131
|
+
netio_read_remove,
|
|
132
|
+
netio_write_less_than,
|
|
133
|
+
netio_write_remove,
|
|
134
|
+
last_stopped_at,
|
|
135
|
+
host,
|
|
136
|
+
crisis_bytes,
|
|
137
|
+
metrics_port_start,
|
|
138
|
+
environment,
|
|
139
|
+
start_args,
|
|
140
|
+
max_concurrent_upgrades=1,
|
|
141
|
+
max_concurrent_starts=2,
|
|
142
|
+
max_concurrent_removals=1,
|
|
143
|
+
node_removal_strategy="youngest",
|
|
91
144
|
):
|
|
145
|
+
self.cpu_count = cpu_count
|
|
146
|
+
self.node_cap = node_cap
|
|
147
|
+
self.cpu_less_than = cpu_less_than
|
|
148
|
+
self.cpu_remove = cpu_remove
|
|
149
|
+
self.mem_less_than = mem_less_than
|
|
150
|
+
self.mem_remove = mem_remove
|
|
151
|
+
self.hd_less_than = hd_less_than
|
|
152
|
+
self.hd_remove = hd_remove
|
|
153
|
+
self.delay_start = delay_start
|
|
154
|
+
self.delay_upgrade = delay_upgrade
|
|
155
|
+
self.delay_remove = delay_remove
|
|
156
|
+
self.node_storage = node_storage
|
|
157
|
+
self.rewards_address = rewards_address
|
|
158
|
+
self.donate_address = donate_address
|
|
159
|
+
self.max_load_average_allowed = max_load_average_allowed
|
|
160
|
+
self.desired_load_average = desired_load_average
|
|
161
|
+
self.port_start = port_start
|
|
162
|
+
self.hdio_read_less_than = hdio_read_less_than
|
|
163
|
+
self.hdio_read_remove = hdio_read_remove
|
|
164
|
+
self.hdio_write_less_than = hdio_write_less_than
|
|
165
|
+
self.hdio_write_remove = hdio_write_remove
|
|
166
|
+
self.netio_read_less_than = netio_read_less_than
|
|
167
|
+
self.netio_read_remove = netio_read_remove
|
|
168
|
+
self.netio_write_less_than = netio_write_less_than
|
|
169
|
+
self.netio_write_remove = netio_write_remove
|
|
170
|
+
self.last_stopped_at = last_stopped_at
|
|
171
|
+
self.host = host
|
|
172
|
+
self.crisis_bytes = crisis_bytes
|
|
173
|
+
self.metrics_port_start = metrics_port_start
|
|
174
|
+
self.environment = environment
|
|
175
|
+
self.start_args = start_args
|
|
176
|
+
self.max_concurrent_upgrades = max_concurrent_upgrades
|
|
177
|
+
self.max_concurrent_starts = max_concurrent_starts
|
|
178
|
+
self.max_concurrent_removals = max_concurrent_removals
|
|
179
|
+
self.node_removal_strategy = node_removal_strategy
|
|
92
180
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
181
|
+
def __repr__(self):
|
|
182
|
+
return (
|
|
183
|
+
f"Machine({self.cpu_count},{self.node_cap},{self.cpu_less_than},{self.cpu_remove}"
|
|
184
|
+
+ f",{self.mem_less_than},{self.mem_remove},{self.hd_less_than}"
|
|
185
|
+
+ f",{self.hd_remove},{self.delay_start},{self.delay_upgrade}"
|
|
186
|
+
+ f",{self.delay_remove}"
|
|
187
|
+
+ f',"{self.node_storage}","{self.rewards_address}","{self.donate_address}"'
|
|
188
|
+
+ f",{self.max_load_average_allowed},{self.desired_load_average}"
|
|
189
|
+
+ f",{self.port_start},{self.hdio_read_less_than},{self.hdio_read_remove}"
|
|
190
|
+
+ f",{self.hdio_write_less_than},{self.hdio_write_remove}"
|
|
191
|
+
+ f",{self.netio_read_less_than},{self.netio_read_remove}"
|
|
192
|
+
+ f",{self.netio_write_less_than},{self.netio_write_remove}"
|
|
193
|
+
+ f",{self.last_stopped_at},{self.host},{self.crisis_bytes}"
|
|
194
|
+
+ f",{self.metrics_port_start},{self.environment},{self.start_args})"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
def __json__(self):
|
|
198
|
+
return {
|
|
199
|
+
"cpu_count": self.cpu_count,
|
|
200
|
+
"node_cap": self.node_cap,
|
|
201
|
+
"cpu_less_than": self.cpu_less_than,
|
|
202
|
+
"cpu_remove": self.cpu_remove,
|
|
203
|
+
"mem_less_than": self.mem_less_than,
|
|
204
|
+
"mem_remove": self.mem_remove,
|
|
205
|
+
"hd_less_than": self.hd_less_than,
|
|
206
|
+
"hd_remove": self.hd_remove,
|
|
207
|
+
"delay_start": self.delay_start,
|
|
208
|
+
"delay_upgrade": self.delay_upgrade,
|
|
209
|
+
"delay_remove": self.delay_remove,
|
|
210
|
+
"node_storage": f"{self.node_storage}",
|
|
211
|
+
"rewards_address": f"{self.rewards_address}",
|
|
212
|
+
"donate_address": f"{self.donate_address}",
|
|
213
|
+
"max_load_average_allowed": self.max_load_average_allowed,
|
|
214
|
+
"desired_load_average": self.desired_load_average,
|
|
215
|
+
"port_start": self.port_start,
|
|
216
|
+
"hdio_read_less_than": self.hdio_read_less_than,
|
|
217
|
+
"hdio_read_remove": self.hdio_read_remove,
|
|
218
|
+
"hdio_write_less_than": self.hdio_write_less_than,
|
|
219
|
+
"hdio_write_remove": self.hdio_write_remove,
|
|
220
|
+
"netio_read_less_than": self.netio_read_less_than,
|
|
221
|
+
"netio_read_remove": self.netio_read_remove,
|
|
222
|
+
"netio_write_less_than": self.netio_write_less_than,
|
|
223
|
+
"netio_write_remove": self.netio_write_remove,
|
|
224
|
+
"last_stopped_at": self.last_stopped_at,
|
|
225
|
+
"host": f"{self.host}",
|
|
226
|
+
"crisis_bytes": self.crisis_bytes,
|
|
227
|
+
"metrics_port_start": self.metrics_port_start,
|
|
228
|
+
"environment": f"{self.environment}",
|
|
229
|
+
"start_args": f"{self.start_args}",
|
|
230
|
+
"max_concurrent_upgrades": self.max_concurrent_upgrades,
|
|
231
|
+
"max_concurrent_starts": self.max_concurrent_starts,
|
|
232
|
+
"max_concurrent_removals": self.max_concurrent_removals,
|
|
233
|
+
"node_removal_strategy": f"{self.node_removal_strategy}",
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# NEW: Container table for Docker container management
|
|
238
|
+
class Container(Base):
|
|
239
|
+
"""Optional: Docker containers hosting nodes"""
|
|
240
|
+
|
|
241
|
+
__tablename__ = "container"
|
|
242
|
+
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
|
243
|
+
|
|
244
|
+
# Foreign key to machine
|
|
245
|
+
machine_id: Mapped[int] = mapped_column(ForeignKey("machine.id"), default=1)
|
|
246
|
+
|
|
247
|
+
# Docker container details
|
|
248
|
+
container_id: Mapped[str] = mapped_column(Unicode(64), unique=True)
|
|
249
|
+
name: Mapped[str] = mapped_column(UnicodeText)
|
|
250
|
+
image: Mapped[str] = mapped_column(UnicodeText)
|
|
251
|
+
status: Mapped[str] = mapped_column(Unicode(32)) # running, stopped, etc.
|
|
252
|
+
created_at: Mapped[int] = mapped_column(Integer)
|
|
253
|
+
|
|
254
|
+
# Relationships
|
|
255
|
+
machine: Mapped["Machine"] = relationship(back_populates="containers")
|
|
256
|
+
nodes: Mapped[list["Node"]] = relationship(
|
|
257
|
+
back_populates="container", cascade="all, delete-orphan"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
def __init__(
|
|
261
|
+
self,
|
|
262
|
+
container_id,
|
|
263
|
+
name,
|
|
264
|
+
image,
|
|
265
|
+
status,
|
|
266
|
+
created_at,
|
|
267
|
+
machine_id=1,
|
|
268
|
+
):
|
|
269
|
+
self.container_id = container_id
|
|
270
|
+
self.name = name
|
|
271
|
+
self.image = image
|
|
272
|
+
self.status = status
|
|
273
|
+
self.created_at = created_at
|
|
274
|
+
self.machine_id = machine_id
|
|
119
275
|
|
|
120
276
|
def __repr__(self):
|
|
121
277
|
return (
|
|
122
|
-
f
|
|
123
|
-
+ f"
|
|
124
|
-
+ f",{self.HDRemove},{self.DelayStart},{self.DelayUpgrade}"
|
|
125
|
-
+ f",{self.DelayRemove}"
|
|
126
|
-
+ f',"{self.NodeStorage}","{self.RewardsAddress}","{self.DonateAddress}"'
|
|
127
|
-
+ f",{self.MaxLoadAverageAllowed},{self.DesiredLoadAverage}"
|
|
128
|
-
+ f",{self.PortStart},{self.HDIOReadLessThan},{self.HDIOReadRemove}"
|
|
129
|
-
+ f",{self.HDIOWriteLessThan},{self.HDIOWriteRemove}"
|
|
130
|
-
+ f",{self.NetIOReadLessThan},{self.NetIOReadRemove}"
|
|
131
|
-
+ f",{self.NetIOWriteLessThan},{self.NetIOWriteRemove}"
|
|
132
|
-
+ f",{self.LastStoppedAt})"
|
|
278
|
+
f'Container({self.id},"{self.container_id}","{self.name}","{self.image}"'
|
|
279
|
+
+ f',"{self.status}",{self.created_at})'
|
|
133
280
|
)
|
|
134
281
|
|
|
135
282
|
def __json__(self):
|
|
136
283
|
return {
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
"
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
"HDRemove": self.HDRemove,
|
|
145
|
-
"DelayStart": self.DelayStart,
|
|
146
|
-
"DelayUpgrade": self.DelayUpgrade,
|
|
147
|
-
"DelayRemove": self.DelayRemove,
|
|
148
|
-
"NodeStorage": f"{self.NodeStorage}",
|
|
149
|
-
"RewardsAddress": f"{self.RewardsAddress}",
|
|
150
|
-
"DonateAddress": f"{self.DonateAddress}",
|
|
151
|
-
"MaxLoadAverageAllowed": self.MaxLoadAverageAllowed,
|
|
152
|
-
"DesiredLoadAverage": self.DesiredLoadAverage,
|
|
153
|
-
"PortStart": self.PortStart,
|
|
154
|
-
"HDIOReadLessThan": self.HDIOReadLessThan,
|
|
155
|
-
"HDIOReadRemove": self.HDIOReadRemove,
|
|
156
|
-
"HDIOWriteLessThan": self.HDIOWriteLessThan,
|
|
157
|
-
"HDIOWriteRemove": self.HDIOWriteRemove,
|
|
158
|
-
"NetIOReadLessThan": self.NetIOReadLessThan,
|
|
159
|
-
"NetIOReadRemove": self.NetIOReadRemove,
|
|
160
|
-
"NetIOWriteLessThan": self.NetIOWriteLessThan,
|
|
161
|
-
"NetIOWriteRemove": self.NetIOWriteRemove,
|
|
162
|
-
"LastStoppedAt": self.LastStoppedAt,
|
|
284
|
+
"id": self.id,
|
|
285
|
+
"container_id": f"{self.container_id}",
|
|
286
|
+
"name": f"{self.name}",
|
|
287
|
+
"image": f"{self.image}",
|
|
288
|
+
"status": f"{self.status}",
|
|
289
|
+
"created_at": self.created_at,
|
|
290
|
+
"machine_id": self.machine_id,
|
|
163
291
|
}
|
|
164
292
|
|
|
165
293
|
|
|
166
294
|
# Extend the Base class to create our Node info
|
|
167
295
|
class Node(Base):
|
|
296
|
+
"""Nodes on host OS or in containers"""
|
|
297
|
+
|
|
168
298
|
__tablename__ = "node"
|
|
169
299
|
# No schema in sqlite3
|
|
170
300
|
# __table_args__ = {"schema": "colony"}
|
|
171
301
|
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
|
302
|
+
|
|
303
|
+
# Foreign key to machine
|
|
304
|
+
machine_id: Mapped[int] = mapped_column(ForeignKey("machine.id"), default=1)
|
|
305
|
+
|
|
306
|
+
# NEW: Optional container reference
|
|
307
|
+
container_id: Mapped[Optional[int]] = mapped_column(
|
|
308
|
+
ForeignKey("container.id"), nullable=True
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# NEW: Process manager type
|
|
312
|
+
manager_type: Mapped[str] = mapped_column(
|
|
313
|
+
UnicodeText, default="systemd"
|
|
314
|
+
) # "systemd", "docker", "setsid", "antctl", "launchctl"
|
|
315
|
+
|
|
172
316
|
# Maps to antnode-{nodename}
|
|
173
|
-
|
|
317
|
+
node_name: Mapped[str] = mapped_column(Unicode(10))
|
|
174
318
|
# service definition name
|
|
175
319
|
service: Mapped[str] = mapped_column(UnicodeText)
|
|
176
320
|
# User running node
|
|
@@ -201,15 +345,27 @@ class Node(Base):
|
|
|
201
345
|
uptime: Mapped[int] = mapped_column(Integer)
|
|
202
346
|
# Number of shuns
|
|
203
347
|
shunned: Mapped[int] = mapped_column(Integer)
|
|
348
|
+
# Number of connected peers as reported by node
|
|
349
|
+
connected_peers: Mapped[int] = mapped_column(Integer, default=0)
|
|
204
350
|
# Timestamp of node first launch
|
|
205
351
|
age: Mapped[int] = mapped_column(Integer)
|
|
206
|
-
# Host ip
|
|
207
|
-
host: Mapped[
|
|
352
|
+
# Host ip for data
|
|
353
|
+
host: Mapped[str] = mapped_column(UnicodeText)
|
|
354
|
+
# node launch method
|
|
355
|
+
method: Mapped[str] = mapped_column(UnicodeText)
|
|
356
|
+
# node layout
|
|
357
|
+
layout: Mapped[str] = mapped_column(UnicodeText)
|
|
358
|
+
# node environment settings
|
|
359
|
+
environment: Mapped[Optional[str]] = mapped_column(UnicodeText)
|
|
360
|
+
|
|
361
|
+
# Relationships
|
|
362
|
+
machine: Mapped["Machine"] = relationship(back_populates="nodes")
|
|
363
|
+
container: Mapped[Optional["Container"]] = relationship(back_populates="nodes")
|
|
208
364
|
|
|
209
365
|
def __init__(
|
|
210
366
|
self,
|
|
211
367
|
id,
|
|
212
|
-
|
|
368
|
+
node_name,
|
|
213
369
|
service,
|
|
214
370
|
user,
|
|
215
371
|
binary,
|
|
@@ -225,11 +381,18 @@ class Node(Base):
|
|
|
225
381
|
records,
|
|
226
382
|
uptime,
|
|
227
383
|
shunned,
|
|
228
|
-
|
|
229
|
-
|
|
384
|
+
connected_peers=0,
|
|
385
|
+
age=None,
|
|
386
|
+
host=None,
|
|
387
|
+
method=None,
|
|
388
|
+
layout=None,
|
|
389
|
+
environment=None,
|
|
390
|
+
machine_id=1,
|
|
391
|
+
container_id=None,
|
|
392
|
+
manager_type="systemd",
|
|
230
393
|
):
|
|
231
394
|
self.id = id
|
|
232
|
-
self.
|
|
395
|
+
self.node_name = node_name
|
|
233
396
|
self.service = service
|
|
234
397
|
self.user = user
|
|
235
398
|
self.binary = binary
|
|
@@ -245,21 +408,30 @@ class Node(Base):
|
|
|
245
408
|
self.records = records
|
|
246
409
|
self.uptime = uptime
|
|
247
410
|
self.shunned = shunned
|
|
411
|
+
self.connected_peers = connected_peers
|
|
248
412
|
self.age = age
|
|
249
413
|
self.host = host
|
|
414
|
+
self.method = method
|
|
415
|
+
self.layout = layout
|
|
416
|
+
self.environment = environment
|
|
417
|
+
self.machine_id = machine_id
|
|
418
|
+
self.container_id = container_id
|
|
419
|
+
self.manager_type = manager_type
|
|
250
420
|
|
|
251
421
|
def __repr__(self):
|
|
252
422
|
return (
|
|
253
|
-
f'Node({self.id},"{self.
|
|
423
|
+
f'Node({self.id},"{self.node_name}","{self.service}","{self.user},"{self.binary}"'
|
|
254
424
|
+ f',"{self.version}","{self.root_dir}",{self.port},{self.metrics_port}'
|
|
255
425
|
+ f',"{self.network}","{self.wallet}","{self.peer_id}","{self.status}",{self.timestamp}'
|
|
256
|
-
+ f',{self.records},{self.uptime},{self.shunned},{self.age},"{self.host}"
|
|
426
|
+
+ f',{self.records},{self.uptime},{self.shunned},{self.connected_peers},{self.age},"{self.host}"'
|
|
427
|
+
+ f',{self.method},{self.layout},"{self.environment}"'
|
|
428
|
+
+ f',{self.machine_id},{self.container_id},"{self.manager_type}")'
|
|
257
429
|
)
|
|
258
430
|
|
|
259
431
|
def __json__(self):
|
|
260
432
|
return {
|
|
261
433
|
"id": self.id,
|
|
262
|
-
"
|
|
434
|
+
"node_name": f"{self.node_name}",
|
|
263
435
|
"service": f"{self.service}",
|
|
264
436
|
"user": f"{self.user}",
|
|
265
437
|
"binary": f"{self.binary}",
|
|
@@ -275,6 +447,13 @@ class Node(Base):
|
|
|
275
447
|
"records": self.records,
|
|
276
448
|
"uptime": self.uptime,
|
|
277
449
|
"shunned": self.shunned,
|
|
450
|
+
"connected_peers": self.connected_peers,
|
|
278
451
|
"age": self.age,
|
|
279
452
|
"host": f"{self.host}",
|
|
453
|
+
"method": f"{self.method}",
|
|
454
|
+
"layout": f"{self.layout}",
|
|
455
|
+
"environment": f"{self.environment}",
|
|
456
|
+
"machine_id": self.machine_id,
|
|
457
|
+
"container_id": self.container_id,
|
|
458
|
+
"manager_type": f"{self.manager_type}",
|
|
280
459
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Process managers for node lifecycle management.
|
|
3
|
+
|
|
4
|
+
Supports multiple backends: systemd, docker, setsid, antctl, launchctl
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from wnm.process_managers.base import NodeProcess, ProcessManager
|
|
8
|
+
from wnm.process_managers.docker_manager import DockerManager
|
|
9
|
+
from wnm.process_managers.factory import get_default_manager_type, get_process_manager
|
|
10
|
+
from wnm.process_managers.launchd_manager import LaunchctlManager
|
|
11
|
+
from wnm.process_managers.setsid_manager import SetsidManager
|
|
12
|
+
from wnm.process_managers.systemd_manager import SystemdManager
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"NodeProcess",
|
|
16
|
+
"ProcessManager",
|
|
17
|
+
"get_process_manager",
|
|
18
|
+
"get_default_manager_type",
|
|
19
|
+
"SystemdManager",
|
|
20
|
+
"DockerManager",
|
|
21
|
+
"SetsidManager",
|
|
22
|
+
"LaunchctlManager",
|
|
23
|
+
]
|