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.
Files changed (21) hide show
  1. {flowmesh_cli_stack-0.1.9/src/flowmesh_cli_stack.egg-info → flowmesh_cli_stack-0.1.10rc2}/PKG-INFO +3 -3
  2. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/pyproject.toml +3 -3
  3. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/.env.example +8 -0
  4. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/env_schema.py +33 -0
  5. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/worker.py +21 -21
  6. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2/src/flowmesh_cli_stack.egg-info}/PKG-INFO +3 -3
  7. flowmesh_cli_stack-0.1.10rc2/src/flowmesh_cli_stack.egg-info/requires.txt +5 -0
  8. flowmesh_cli_stack-0.1.9/src/flowmesh_cli_stack.egg-info/requires.txt +0 -5
  9. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/LICENSE +0 -0
  10. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/README.md +0 -0
  11. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/setup.cfg +0 -0
  12. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/__init__.py +0 -0
  13. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/compose.yml +0 -0
  14. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/assets/docker-bake.hcl +0 -0
  15. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/bundle.py +0 -0
  16. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/image.py +0 -0
  17. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/stack.py +0 -0
  18. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack/utils.py +0 -0
  19. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack.egg-info/SOURCES.txt +0 -0
  20. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack.egg-info/dependency_links.txt +0 -0
  21. {flowmesh_cli_stack-0.1.9 → flowmesh_cli_stack-0.1.10rc2}/src/flowmesh_cli_stack.egg-info/top_level.txt +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowmesh-cli-stack
3
- Version: 0.1.9
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.9
10
- Requires-Dist: flowmesh-sdk-stack==0.1.9
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.9"
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.9",
15
- "flowmesh-sdk-stack==0.1.9",
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",
@@ -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
@@ -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
- name_template: str | None = typer.Option(
83
+ alias_template: str | None = typer.Option(
84
84
  None,
85
- "--name-template",
85
+ "--alias-template",
86
86
  help=(
87
- "Worker name template for cpu/gpu presets. Placeholders: "
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
- name_template=name_template,
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
- worker_name = worker_info.get("name", "<unknown>")
124
- logging.success(f"Created {label} '{worker_name}':")
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
- names: list[str] = typer.Argument(..., help="Worker name(s) or 'all'"),
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, names, operation="start")
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 name in started:
150
- logging.success(f"Started worker {name}")
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
- names: list[str] = typer.Argument(..., help="Worker name(s) or 'all'"),
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, names, operation="stop")
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 name in stopped:
175
- logging.success(f"Stopped worker {name}")
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
- names: list[str] = typer.Argument(..., help="Worker name(s) or 'all'"),
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 names:
192
- if len(names) != 1:
193
- logging.error("Use either 'all' or worker names, not both.")
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, names, operation="destroy")
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 name in destroyed:
213
- logging.success(f"Destroyed worker {name}")
212
+ for alias in destroyed:
213
+ logging.success(f"Destroyed worker {alias}")
214
214
 
215
215
 
216
216
  @app.command("pull")
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowmesh-cli-stack
3
- Version: 0.1.9
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.9
10
- Requires-Dist: flowmesh-sdk-stack==0.1.9
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
@@ -0,0 +1,5 @@
1
+ flowmesh-cli==0.1.10rc2
2
+ flowmesh-sdk-stack==0.1.10rc2
3
+ docker>=7.1.0
4
+ packaging>=24
5
+ pyyaml>=6.0.2
@@ -1,5 +0,0 @@
1
- flowmesh-cli==0.1.9
2
- flowmesh-sdk-stack==0.1.9
3
- docker>=7.1.0
4
- packaging>=24
5
- pyyaml>=6.0.2