flowmesh-cli-stack 0.1.9__tar.gz → 0.1.10rc2__tar.gz
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.
- {flowmesh_cli_stack-0.1.9/src/flowmesh_cli_stack.egg-info → flowmesh_cli_stack-0.1.10rc2}/PKG-INFO +3 -3
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/pyproject.toml +3 -3
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/.env.example +8 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/env_schema.py +33 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/worker.py +21 -21
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2/src/flowmesh_cli_stack.egg-info}/PKG-INFO +3 -3
- flowmesh_cli_stack-0.1.10rc2/src/flowmesh_cli_stack.egg-info/requires.txt +5 -0
- flowmesh_cli_stack-0.1.9/src/flowmesh_cli_stack.egg-info/requires.txt +0 -5
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/LICENSE +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/README.md +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/setup.cfg +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/__init__.py +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/compose.yml +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/docker-bake.hcl +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/bundle.py +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/image.py +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/stack.py +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/utils.py +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack.egg-info/SOURCES.txt +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack.egg-info/dependency_links.txt +0 -0
- {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack.egg-info/top_level.txt +0 -0
{flowmesh_cli_stack-0.1.9/src/flowmesh_cli_stack.egg-info → flowmesh_cli_stack-0.1.10rc2}/PKG-INFO
RENAMED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowmesh-cli-stack
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10rc2
|
|
4
4
|
Summary: FlowMesh CLI stack commands
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
License-File: LICENSE
|
|
9
|
-
Requires-Dist: flowmesh-cli==0.1.
|
|
10
|
-
Requires-Dist: flowmesh-sdk-stack==0.1.
|
|
9
|
+
Requires-Dist: flowmesh-cli==0.1.10rc2
|
|
10
|
+
Requires-Dist: flowmesh-sdk-stack==0.1.10rc2
|
|
11
11
|
Requires-Dist: docker>=7.1.0
|
|
12
12
|
Requires-Dist: packaging>=24
|
|
13
13
|
Requires-Dist: pyyaml>=6.0.2
|
|
@@ -4,15 +4,15 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "flowmesh-cli-stack"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.10rc2"
|
|
8
8
|
description = "FlowMesh CLI stack commands"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
11
11
|
license = "Apache-2.0"
|
|
12
12
|
license-files = ["LICENSE"]
|
|
13
13
|
dependencies = [
|
|
14
|
-
"flowmesh-cli==0.1.
|
|
15
|
-
"flowmesh-sdk-stack==0.1.
|
|
14
|
+
"flowmesh-cli==0.1.10rc2",
|
|
15
|
+
"flowmesh-sdk-stack==0.1.10rc2",
|
|
16
16
|
"docker>=7.1.0",
|
|
17
17
|
"packaging>=24",
|
|
18
18
|
"pyyaml>=6.0.2",
|
{flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/.env.example
RENAMED
|
@@ -181,6 +181,14 @@ SERVER_CUDA_PROBE_IMAGE=nvidia/cuda:12.9.1-base-ubuntu24.04
|
|
|
181
181
|
# Optional Docker runtime name for GPU containers.
|
|
182
182
|
DOCKER_GPU_RUNTIME=nvidia
|
|
183
183
|
CUDA_VISIBLE_DEVICES=all
|
|
184
|
+
# Report a GPU as unavailable while a process outside FlowMesh uses it.
|
|
185
|
+
WORKER_FOREIGN_GPU_GATE=true
|
|
186
|
+
# Foreign GPU-memory threshold in MiB.
|
|
187
|
+
WORKER_FOREIGN_GPU_MEM_MIB=1024
|
|
188
|
+
# Consecutive occupancy readings required before a device changes availability.
|
|
189
|
+
WORKER_FOREIGN_GPU_CONSECUTIVE=2
|
|
190
|
+
# Delay occupancy checks after a worker task completes.
|
|
191
|
+
WORKER_FOREIGN_GPU_GRACE_SEC=90
|
|
184
192
|
WORKER_UPLOAD_RESULTS=false
|
|
185
193
|
WORKER_EXECUTOR_IDLE_CLEANUP_SEC=60
|
|
186
194
|
MODEL_CLEANUP_AFTER_UPLOAD=0
|
{flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/env_schema.py
RENAMED
|
@@ -593,6 +593,39 @@ STACK_ENV_SCHEMA = EnvSchema(
|
|
|
593
593
|
EnvVar(
|
|
594
594
|
"CUDA_VISIBLE_DEVICES", "all", var_type=EnvVarType.CSV_INTS_OR_ALL
|
|
595
595
|
),
|
|
596
|
+
EnvVar(
|
|
597
|
+
"WORKER_FOREIGN_GPU_GATE",
|
|
598
|
+
"true",
|
|
599
|
+
description=[
|
|
600
|
+
"Report a GPU as unavailable while a process outside "
|
|
601
|
+
"FlowMesh uses it.",
|
|
602
|
+
],
|
|
603
|
+
var_type=EnvVarType.BOOL,
|
|
604
|
+
),
|
|
605
|
+
EnvVar(
|
|
606
|
+
"WORKER_FOREIGN_GPU_MEM_MIB",
|
|
607
|
+
"1024",
|
|
608
|
+
description="Foreign GPU-memory threshold in MiB.",
|
|
609
|
+
var_type=EnvVarType.INT,
|
|
610
|
+
min_value=1,
|
|
611
|
+
),
|
|
612
|
+
EnvVar(
|
|
613
|
+
"WORKER_FOREIGN_GPU_CONSECUTIVE",
|
|
614
|
+
"2",
|
|
615
|
+
description=[
|
|
616
|
+
"Consecutive occupancy readings required before a device "
|
|
617
|
+
"changes availability.",
|
|
618
|
+
],
|
|
619
|
+
var_type=EnvVarType.INT,
|
|
620
|
+
min_value=1,
|
|
621
|
+
),
|
|
622
|
+
EnvVar(
|
|
623
|
+
"WORKER_FOREIGN_GPU_GRACE_SEC",
|
|
624
|
+
"90",
|
|
625
|
+
description="Delay occupancy checks after a worker task completes.",
|
|
626
|
+
var_type=EnvVarType.FLOAT,
|
|
627
|
+
min_value=0,
|
|
628
|
+
),
|
|
596
629
|
EnvVar("WORKER_UPLOAD_RESULTS", "false", var_type=EnvVarType.BOOL),
|
|
597
630
|
EnvVar(
|
|
598
631
|
"WORKER_EXECUTOR_IDLE_CLEANUP_SEC",
|
|
@@ -80,11 +80,11 @@ def worker_up(
|
|
|
80
80
|
"Repeat --config-raw to provide multiple configs."
|
|
81
81
|
),
|
|
82
82
|
),
|
|
83
|
-
|
|
83
|
+
alias_template: str | None = typer.Option(
|
|
84
84
|
None,
|
|
85
|
-
"--
|
|
85
|
+
"--alias-template",
|
|
86
86
|
help=(
|
|
87
|
-
"Worker
|
|
87
|
+
"Worker alias template for cpu/gpu presets. Placeholders: "
|
|
88
88
|
"{slug}, {kind}, {idx}, {gpu}. "
|
|
89
89
|
"Default: '{slug}_worker_{kind}_{idx|gpu}'."
|
|
90
90
|
),
|
|
@@ -113,21 +113,21 @@ def worker_up(
|
|
|
113
113
|
targets=targets,
|
|
114
114
|
config_paths=config,
|
|
115
115
|
config_raw=config_raw,
|
|
116
|
-
|
|
116
|
+
alias_template=alias_template,
|
|
117
117
|
slug=slug,
|
|
118
118
|
)
|
|
119
119
|
except FlowMeshError as exc:
|
|
120
120
|
logging.error(str(exc))
|
|
121
121
|
raise typer.Exit(code=1)
|
|
122
122
|
for label, worker_info in created:
|
|
123
|
-
|
|
124
|
-
logging.success(f"Created {label} '{
|
|
123
|
+
worker_alias = worker_info.get("alias", "<unknown>")
|
|
124
|
+
logging.success(f"Created {label} '{worker_alias}':")
|
|
125
125
|
logging.log(json.dumps(worker_info, indent=2))
|
|
126
126
|
|
|
127
127
|
|
|
128
128
|
@app.command("start")
|
|
129
129
|
def worker_start(
|
|
130
|
-
|
|
130
|
+
aliases: list[str] = typer.Argument(..., help="Worker alias(es) or 'all'"),
|
|
131
131
|
env_file: Path = typer.Option(
|
|
132
132
|
DEFAULT_ENV_FILE, "--env-file", help="Env file to load defaults"
|
|
133
133
|
),
|
|
@@ -139,20 +139,20 @@ def worker_start(
|
|
|
139
139
|
"""Start a stopped worker container."""
|
|
140
140
|
client = stack_node_client(env_file, base_url, token or None)
|
|
141
141
|
try:
|
|
142
|
-
started = operate_workers(client,
|
|
142
|
+
started = operate_workers(client, aliases, operation="start")
|
|
143
143
|
except FlowMeshError as exc:
|
|
144
144
|
logging.error(str(exc))
|
|
145
145
|
raise typer.Exit(code=1)
|
|
146
146
|
if not started:
|
|
147
147
|
logging.warning("No workers found.")
|
|
148
148
|
return
|
|
149
|
-
for
|
|
150
|
-
logging.success(f"Started worker {
|
|
149
|
+
for alias in started:
|
|
150
|
+
logging.success(f"Started worker {alias}")
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
@app.command("stop")
|
|
154
154
|
def worker_stop(
|
|
155
|
-
|
|
155
|
+
aliases: list[str] = typer.Argument(..., help="Worker alias(es) or 'all'"),
|
|
156
156
|
env_file: Path = typer.Option(
|
|
157
157
|
DEFAULT_ENV_FILE, "--env-file", help="Env file to load defaults"
|
|
158
158
|
),
|
|
@@ -164,20 +164,20 @@ def worker_stop(
|
|
|
164
164
|
"""Stop a running worker container without removing it."""
|
|
165
165
|
client = stack_node_client(env_file, base_url, token or None)
|
|
166
166
|
try:
|
|
167
|
-
stopped = operate_workers(client,
|
|
167
|
+
stopped = operate_workers(client, aliases, operation="stop")
|
|
168
168
|
except FlowMeshError as exc:
|
|
169
169
|
logging.error(str(exc))
|
|
170
170
|
raise typer.Exit(code=1)
|
|
171
171
|
if not stopped:
|
|
172
172
|
logging.warning("No workers found.")
|
|
173
173
|
return
|
|
174
|
-
for
|
|
175
|
-
logging.success(f"Stopped worker {
|
|
174
|
+
for alias in stopped:
|
|
175
|
+
logging.success(f"Stopped worker {alias}")
|
|
176
176
|
|
|
177
177
|
|
|
178
178
|
@app.command("down")
|
|
179
179
|
def worker_down(
|
|
180
|
-
|
|
180
|
+
aliases: list[str] = typer.Argument(..., help="Worker alias(es) or 'all'"),
|
|
181
181
|
env_file: Path = typer.Option(
|
|
182
182
|
DEFAULT_ENV_FILE, "--env-file", help="Env file to load defaults"
|
|
183
183
|
),
|
|
@@ -188,9 +188,9 @@ def worker_down(
|
|
|
188
188
|
) -> None:
|
|
189
189
|
"""Destroy a worker or all workers, removing containers and associated resources."""
|
|
190
190
|
client = stack_node_client(env_file, base_url, token or None)
|
|
191
|
-
if "all" in
|
|
192
|
-
if len(
|
|
193
|
-
logging.error("Use either 'all' or worker
|
|
191
|
+
if "all" in aliases:
|
|
192
|
+
if len(aliases) != 1:
|
|
193
|
+
logging.error("Use either 'all' or worker aliases, not both.")
|
|
194
194
|
raise typer.Exit(code=1)
|
|
195
195
|
try:
|
|
196
196
|
logging.info("Destroying all workers...")
|
|
@@ -202,15 +202,15 @@ def worker_down(
|
|
|
202
202
|
return
|
|
203
203
|
|
|
204
204
|
try:
|
|
205
|
-
destroyed = operate_workers(client,
|
|
205
|
+
destroyed = operate_workers(client, aliases, operation="destroy")
|
|
206
206
|
except FlowMeshError as exc:
|
|
207
207
|
logging.error(str(exc))
|
|
208
208
|
raise typer.Exit(code=1)
|
|
209
209
|
if not destroyed:
|
|
210
210
|
logging.warning("No workers found.")
|
|
211
211
|
return
|
|
212
|
-
for
|
|
213
|
-
logging.success(f"Destroyed worker {
|
|
212
|
+
for alias in destroyed:
|
|
213
|
+
logging.success(f"Destroyed worker {alias}")
|
|
214
214
|
|
|
215
215
|
|
|
216
216
|
@app.command("pull")
|
{flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2/src/flowmesh_cli_stack.egg-info}/PKG-INFO
RENAMED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowmesh-cli-stack
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10rc2
|
|
4
4
|
Summary: FlowMesh CLI stack commands
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
License-File: LICENSE
|
|
9
|
-
Requires-Dist: flowmesh-cli==0.1.
|
|
10
|
-
Requires-Dist: flowmesh-sdk-stack==0.1.
|
|
9
|
+
Requires-Dist: flowmesh-cli==0.1.10rc2
|
|
10
|
+
Requires-Dist: flowmesh-sdk-stack==0.1.10rc2
|
|
11
11
|
Requires-Dist: docker>=7.1.0
|
|
12
12
|
Requires-Dist: packaging>=24
|
|
13
13
|
Requires-Dist: pyyaml>=6.0.2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/__init__.py
RENAMED
|
File without changes
|
{flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/compose.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|