wnm 0.0.9__py3-none-any.whl → 0.0.11__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
@@ -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
- CpuCount: Mapped[int] = mapped_column(Integer)
36
- NodeCap: Mapped[int] = mapped_column(Integer)
37
- CpuLessThan: Mapped[int] = mapped_column(Integer)
38
- CpuRemove: Mapped[int] = mapped_column(Integer)
39
- MemLessThan: Mapped[int] = mapped_column(Integer)
40
- MemRemove: Mapped[int] = mapped_column(Integer)
41
- HDLessThan: Mapped[int] = mapped_column(Integer)
42
- HDRemove: Mapped[int] = mapped_column(Integer)
43
- DelayStart: Mapped[int] = mapped_column(Integer)
44
- DelayUpgrade: Mapped[int] = mapped_column(Integer)
45
- DelayRemove: Mapped[int] = mapped_column(Integer)
46
- NodeStorage: Mapped[str] = mapped_column(UnicodeText)
47
- RewardsAddress: Mapped[str] = mapped_column(UnicodeText)
48
- DonateAddress: Mapped[str] = mapped_column(UnicodeText)
49
- MaxLoadAverageAllowed: Mapped[float] = mapped_column(Float)
50
- DesiredLoadAverage: Mapped[float] = mapped_column(Float)
51
- # What port to begin assigning nodes
52
- PortStart: Mapped[int] = mapped_column(Integer)
53
- HDIOReadLessThan: Mapped[float] = mapped_column(Float)
54
- HDIOReadRemove: Mapped[float] = mapped_column(Float)
55
- HDIOWriteLessThan: Mapped[float] = mapped_column(Float)
56
- HDIOWriteRemove: Mapped[float] = mapped_column(Float)
57
- NetIOReadLessThan: Mapped[float] = mapped_column(Float)
58
- NetIOReadRemove: Mapped[float] = mapped_column(Float)
59
- NetIOWriteLessThan: Mapped[float] = mapped_column(Float)
60
- NetIOWriteRemove: Mapped[float] = mapped_column(Float)
61
- LastStoppedAt: Mapped[int] = mapped_column(Integer)
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
- CpuCount,
66
- NodeCap,
67
- CpuLessThan,
68
- CpuRemove,
69
- MemLessThan,
70
- MemRemove,
71
- HDLessThan,
72
- HDRemove,
73
- DelayStart,
74
- DelayUpgrade,
75
- DelayRemove,
76
- NodeStorage,
77
- RewardsAddress,
78
- DonateAddress,
79
- MaxLoadAverageAllowed,
80
- DesiredLoadAverage,
81
- PortStart,
82
- HDIOReadLessThan,
83
- HDIOReadRemove,
84
- HDIOWriteLessThan,
85
- HDIOWriteRemove,
86
- NetIOReadLessThan,
87
- NetIOReadRemove,
88
- NetIOWriteLessThan,
89
- NetIOWriteRemove,
90
- LastStoppedAt,
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
- self.CpuCount = CpuCount
94
- self.NodeCap = NodeCap
95
- self.CpuLessThan = CpuLessThan
96
- self.CpuRemove = CpuRemove
97
- self.MemLessThan = MemLessThan
98
- self.MemRemove = MemRemove
99
- self.HDLessThan = HDLessThan
100
- self.HDRemove = HDRemove
101
- self.DelayStart = DelayStart
102
- self.DelayUpgrade = DelayUpgrade
103
- self.DelayRemove = DelayRemove
104
- self.NodeStorage = NodeStorage
105
- self.RewardsAddress = RewardsAddress
106
- self.DonateAddress = DonateAddress
107
- self.MaxLoadAverageAllowed = MaxLoadAverageAllowed
108
- self.DesiredLoadAverage = DesiredLoadAverage
109
- self.PortStart = PortStart
110
- self.HDIOReadLessThan = HDIOReadLessThan
111
- self.HDIOReadRemove = HDIOReadRemove
112
- self.HDIOWriteLessThan = HDIOWriteLessThan
113
- self.HDIOWriteRemove = HDIOWriteRemove
114
- self.NetIOReadLessThan = NetIOReadLessThan
115
- self.NetIOReadRemove = NetIOReadRemove
116
- self.NetIOWriteLessThan = NetIOWriteLessThan
117
- self.NetIOWriteRemove = NetIOWriteRemove
118
- self.LastStoppedAt = LastStoppedAt
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"Machine({self.CpuCount},{self.NodeCap},{self.CpuLessThan},{self.CpuRemove}"
123
- + f",{self.MemLessThan},{self.MemRemove},{self.HDLessThan}"
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
- "CpuCount": self.CpuCount,
138
- "NodeCap": self.NodeCap,
139
- "CpuLessThan": self.CpuLessThan,
140
- "CpuRemove": self.CpuRemove,
141
- "MemLessThan": self.MemLessThan,
142
- "MemRemove": self.MemRemove,
143
- "HDLessThan": self.HDLessThan,
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
- nodename: Mapped[str] = mapped_column(Unicode(10))
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/name for data and metrics ports
207
- 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)
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
- nodename,
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
- age,
229
- host,
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.nodename = nodename
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.nodename}","{self.service}","{self.user},"{self.binary}"'
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
- "nodename": f"{self.nodename}",
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
+ ]