wnm 0.0.8__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/models.py CHANGED
@@ -1,122 +1,320 @@
1
- import json_fix
2
-
3
1
  # Turn a class into a storable object with ORM
4
2
  from typing import Optional
5
- from sqlalchemy import Integer, Unicode, UnicodeText, Float
6
- from sqlalchemy import create_engine, select, insert, update
7
- from sqlalchemy.orm import sessionmaker, scoped_session
8
- from sqlalchemy.orm import DeclarativeBase
9
- from sqlalchemy.orm import Mapped, mapped_column
3
+
4
+ import json_fix
5
+ from sqlalchemy import (
6
+ Float,
7
+ ForeignKey,
8
+ Integer,
9
+ Unicode,
10
+ UnicodeText,
11
+ create_engine,
12
+ insert,
13
+ select,
14
+ update,
15
+ )
16
+ from sqlalchemy.orm import (
17
+ DeclarativeBase,
18
+ Mapped,
19
+ mapped_column,
20
+ relationship,
21
+ scoped_session,
22
+ sessionmaker,
23
+ )
24
+
10
25
 
11
26
  # create a Base class bound to sqlalchemy
12
27
  class Base(DeclarativeBase):
13
28
  pass
14
29
 
30
+
15
31
  # Extend the Base class to create our Host info
16
32
  class Machine(Base):
17
- __tablename__ = 'machine'
33
+ """One row per wnm instance (single physical machine)"""
34
+
35
+ __tablename__ = "machine"
18
36
  # No schema in sqlite3
19
37
  # __table_args__ = {"schema": "colony"}
20
38
  id: Mapped[int] = mapped_column(Integer, primary_key=True)
21
- CpuCount: Mapped[int] = mapped_column(Integer)
22
- NodeCap: Mapped[int] = mapped_column(Integer)
23
- CpuLessThan: Mapped[int] = mapped_column(Integer)
24
- CpuRemove: Mapped[int] = mapped_column(Integer)
25
- MemLessThan: Mapped[int] = mapped_column(Integer)
26
- MemRemove: Mapped[int] = mapped_column(Integer)
27
- HDLessThan: Mapped[int] = mapped_column(Integer)
28
- HDRemove: Mapped[int] = mapped_column(Integer)
29
- DelayStart: Mapped[int] = mapped_column(Integer)
30
- DelayUpgrade: Mapped[int] = mapped_column(Integer)
31
- DelayRemove: Mapped[int] = mapped_column(Integer)
32
- NodeStorage: Mapped[str] = mapped_column(UnicodeText)
33
- RewardsAddress: Mapped[str] = mapped_column(UnicodeText)
34
- DonateAddress: Mapped[str] = mapped_column(UnicodeText)
35
- MaxLoadAverageAllowed: Mapped[float] = mapped_column(Float)
36
- DesiredLoadAverage: Mapped[float] = mapped_column(Float)
37
- # What port to begin assigning nodes
38
- PortStart: Mapped[int] = mapped_column(Integer)
39
- HDIOReadLessThan: Mapped[float] = mapped_column(Float)
40
- HDIOReadRemove: Mapped[float] = mapped_column(Float)
41
- HDIOWriteLessThan: Mapped[float] = mapped_column(Float)
42
- HDIOWriteRemove: Mapped[float] = mapped_column(Float)
43
- NetIOReadLessThan: Mapped[float] = mapped_column(Float)
44
- NetIOReadRemove: Mapped[float] = mapped_column(Float)
45
- NetIOWriteLessThan: Mapped[float] = mapped_column(Float)
46
- NetIOWriteRemove: Mapped[float] = mapped_column(Float)
47
- LastStoppedAt: Mapped[int] = mapped_column(Integer)
48
-
49
- def __init__(self, CpuCount, NodeCap, CpuLessThan, CpuRemove,
50
- MemLessThan, MemRemove, HDLessThan, HDRemove,
51
- DelayStart, DelayUpgrade, DelayRemove, NodeStorage,
52
- RewardsAddress, DonateAddress, MaxLoadAverageAllowed,
53
- DesiredLoadAverage, PortStart, HDIOReadLessThan,
54
- HDIOReadRemove, HDIOWriteLessThan, HDIOWriteRemove,
55
- NetIOReadLessThan, NetIOReadRemove, NetIOWriteLessThan,
56
- NetIOWriteRemove, LastStoppedAt):
57
-
58
- self.CpuCount = CpuCount
59
- self.NodeCap = NodeCap
60
- self.CpuLessThan = CpuLessThan
61
- self.CpuRemove = CpuRemove
62
- self.MemLessThan = MemLessThan
63
- self.MemRemove = MemRemove
64
- self.HDLessThan = HDLessThan
65
- self.HDRemove = HDRemove
66
- self.DelayStart = DelayStart
67
- self.DelayUpgrade = DelayUpgrade
68
- self.DelayRemove = DelayRemove
69
- self.NodeStorage = NodeStorage
70
- self.RewardsAddress = RewardsAddress
71
- self.DonateAddress = DonateAddress
72
- self.MaxLoadAverageAllowed = MaxLoadAverageAllowed
73
- self.DesiredLoadAverage = DesiredLoadAverage
74
- self.PortStart = PortStart
75
- self.HDIOReadLessThan = HDIOReadLessThan
76
- self.HDIOReadRemove = HDIOReadRemove
77
- self.HDIOWriteLessThan = HDIOWriteLessThan
78
- self.HDIOWriteRemove = HDIOWriteRemove
79
- self.NetIOReadLessThan = NetIOReadLessThan
80
- self.NetIOReadRemove = NetIOReadRemove
81
- self.NetIOWriteLessThan = NetIOWriteLessThan
82
- self.NetIOWriteRemove = NetIOWriteRemove
83
- self.LastStoppedAt = LastStoppedAt
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
+ )
106
+
107
+ def __init__(
108
+ self,
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",
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
84
180
 
85
181
  def __repr__(self):
86
- return f'Machine({self.CpuCount},{self.NodeCap},{self.CpuLessThan},{self.CpuRemove}' + \
87
- f',{self.MemLessThan},{self.MemRemove},{self.HDLessThan}' + \
88
- f',{self.HDRemove},{self.DelayStart},{self.DelayUpgrade}' + \
89
- f',{self.DelayRemove}' + \
90
- f',"{self.NodeStorage}","{self.RewardsAddress}","{self.DonateAddress}"' + \
91
- f',{self.MaxLoadAverageAllowed},{self.DesiredLoadAverage}' + \
92
- f',{self.PortStart},{self.HDIOReadLessThan},{self.HDIOReadRemove}' + \
93
- f',{self.HDIOWriteLessThan},{self.HDIOWriteRemove}' + \
94
- f',{self.NetIOReadLessThan},{self.NetIOReadRemove}' + \
95
- f',{self.NetIOWriteLessThan},{self.NetIOWriteRemove}' + \
96
- f',{self.LastStoppedAt})'
97
-
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
+
98
197
  def __json__(self):
99
- return { 'CpuCount': self.CpuCount, 'NodeCap': self.NodeCap, 'CpuLessThan': self.CpuLessThan,
100
- 'CpuRemove': self.CpuRemove, 'MemLessThan': self.MemLessThan, 'MemRemove': self.MemRemove,
101
- 'HDLessThan': self.HDLessThan, 'HDRemove': self.HDRemove, 'DelayStart': self.DelayStart,
102
- 'DelayUpgrade': self.DelayUpgrade, 'DelayRemove': self.DelayRemove, 'NodeStorage': f"{self.NodeStorage}",
103
- 'RewardsAddress': f"{self.RewardsAddress}", 'DonateAddress': f"{self.DonateAddress}",
104
- 'MaxLoadAverageAllowed': self.MaxLoadAverageAllowed, 'DesiredLoadAverage': self.DesiredLoadAverage,
105
- 'PortStart': self.PortStart, 'HDIOReadLessThan': self.HDIOReadLessThan, 'HDIOReadRemove': self.HDIOReadRemove,
106
- 'HDIOWriteLessThan': self.HDIOWriteLessThan, 'HDIOWriteRemove': self.HDIOWriteRemove,
107
- 'NetIOReadLessThan': self.NetIOReadLessThan, 'NetIOReadRemove': self.NetIOReadRemove,
108
- 'NetIOWriteLessThan': self.NetIOWriteLessThan, 'NetIOWriteRemove': self.NetIOWriteRemove,
109
- 'LastStoppedAt': self.LastStoppedAt }
110
-
111
-
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
275
+
276
+ def __repr__(self):
277
+ return (
278
+ f'Container({self.id},"{self.container_id}","{self.name}","{self.image}"'
279
+ + f',"{self.status}",{self.created_at})'
280
+ )
281
+
282
+ def __json__(self):
283
+ return {
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,
291
+ }
292
+
293
+
112
294
  # Extend the Base class to create our Node info
113
295
  class Node(Base):
114
- __tablename__ = 'node'
296
+ """Nodes on host OS or in containers"""
297
+
298
+ __tablename__ = "node"
115
299
  # No schema in sqlite3
116
- #__table_args__ = {"schema": "colony"}
300
+ # __table_args__ = {"schema": "colony"}
117
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
+
118
316
  # Maps to antnode-{nodename}
119
- nodename: Mapped[str] = mapped_column(Unicode(10))
317
+ node_name: Mapped[str] = mapped_column(Unicode(10))
120
318
  # service definition name
121
319
  service: Mapped[str] = mapped_column(UnicodeText)
122
320
  # User running node
@@ -134,30 +332,67 @@ class Node(Base):
134
332
  # Network to use ( Live is evm-arbitrum-one )
135
333
  network: Mapped[str] = mapped_column(UnicodeText)
136
334
  # Reward address
137
- wallet: Mapped[Optional[str]] = mapped_column(Unicode(42),index=True)
335
+ wallet: Mapped[Optional[str]] = mapped_column(Unicode(42), index=True)
138
336
  # Reported peer_id
139
337
  peer_id: Mapped[Optional[str]] = mapped_column(Unicode(52))
140
338
  # Node's last probed status
141
- status: Mapped[str] = mapped_column(Unicode(32),index=True)
339
+ status: Mapped[str] = mapped_column(Unicode(32), index=True)
142
340
  # Timestamp of last update
143
- timestamp: Mapped[int] = mapped_column(Integer,index=True)
341
+ timestamp: Mapped[int] = mapped_column(Integer, index=True)
144
342
  # Number of node records stored as reported by node
145
- records: Mapped[int] = mapped_column(Integer,index=True)
343
+ records: Mapped[int] = mapped_column(Integer, index=True)
146
344
  # Node reported uptime
147
345
  uptime: Mapped[int] = mapped_column(Integer)
148
346
  # Number of shuns
149
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)
150
350
  # Timestamp of node first launch
151
351
  age: Mapped[int] = mapped_column(Integer)
152
- # Host ip/name for data and metrics ports
153
- host: Mapped[Optional[str]] = mapped_column(UnicodeText)
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)
154
360
 
155
- def __init__(self, id, nodename, service, user, binary, version,
156
- root_dir, port, metrics_port, network,
157
- wallet, peer_id, status, timestamp, records,
158
- uptime, shunned, age, host):
361
+ # Relationships
362
+ machine: Mapped["Machine"] = relationship(back_populates="nodes")
363
+ container: Mapped[Optional["Container"]] = relationship(back_populates="nodes")
364
+
365
+ def __init__(
366
+ self,
367
+ id,
368
+ node_name,
369
+ service,
370
+ user,
371
+ binary,
372
+ version,
373
+ root_dir,
374
+ port,
375
+ metrics_port,
376
+ network,
377
+ wallet,
378
+ peer_id,
379
+ status,
380
+ timestamp,
381
+ records,
382
+ uptime,
383
+ shunned,
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",
393
+ ):
159
394
  self.id = id
160
- self.nodename = nodename
395
+ self.node_name = node_name
161
396
  self.service = service
162
397
  self.user = user
163
398
  self.binary = binary
@@ -173,20 +408,52 @@ class Node(Base):
173
408
  self.records = records
174
409
  self.uptime = uptime
175
410
  self.shunned = shunned
411
+ self.connected_peers = connected_peers
176
412
  self.age = age
177
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
178
420
 
179
421
  def __repr__(self):
180
- return f'Node({self.id},"{self.nodename}","{self.service}","{self.user},"{self.binary}"'+\
181
- f',"{self.version}","{self.root_dir}",{self.port},{self.metrics_port}' + \
182
- f',"{self.network}","{self.wallet}","{self.peer_id}","{self.status}",{self.timestamp}' + \
183
- f',{self.records},{self.uptime},{self.shunned},{self.age},"{self.host}")'
184
-
422
+ return (
423
+ f'Node({self.id},"{self.node_name}","{self.service}","{self.user},"{self.binary}"'
424
+ + f',"{self.version}","{self.root_dir}",{self.port},{self.metrics_port}'
425
+ + f',"{self.network}","{self.wallet}","{self.peer_id}","{self.status}",{self.timestamp}'
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}")'
429
+ )
430
+
185
431
  def __json__(self):
186
- return { "id": self.id, "nodename": f"{self.nodename}", "service": f"{self.service}",
187
- "user": f"{self.user}", "binary": f"{self.binary}", "version": f"{self.version}",
188
- "root_dir": f"{self.root_dir}", "port": self.port, "metrics_port": self.metrics_port,
189
- "network": f"{self.network}", "wallet": f"{self.wallet}", "peer_id": f"{self.peer_id}",
190
- "status": f"{self.status}", "timestamp": self.timestamp, "records": self.records,
191
- "uptime": self.uptime, "shunned": self.shunned, "age": self.age,
192
- "host": f"{self.host}" }
432
+ return {
433
+ "id": self.id,
434
+ "node_name": f"{self.node_name}",
435
+ "service": f"{self.service}",
436
+ "user": f"{self.user}",
437
+ "binary": f"{self.binary}",
438
+ "version": f"{self.version}",
439
+ "root_dir": f"{self.root_dir}",
440
+ "port": self.port,
441
+ "metrics_port": self.metrics_port,
442
+ "network": f"{self.network}",
443
+ "wallet": f"{self.wallet}",
444
+ "peer_id": f"{self.peer_id}",
445
+ "status": f"{self.status}",
446
+ "timestamp": self.timestamp,
447
+ "records": self.records,
448
+ "uptime": self.uptime,
449
+ "shunned": self.shunned,
450
+ "connected_peers": self.connected_peers,
451
+ "age": self.age,
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}",
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
+ ]