flowmesh-cli-stack 0.1.0__tar.gz → 0.1.2__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.0/src/flowmesh_cli_stack.egg-info → flowmesh_cli_stack-0.1.2}/PKG-INFO +3 -3
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/pyproject.toml +3 -3
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/.env.example +15 -4
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/compose.yml +4 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/env_schema.py +32 -4
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/stack.py +2 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/utils.py +24 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2/src/flowmesh_cli_stack.egg-info}/PKG-INFO +3 -3
- flowmesh_cli_stack-0.1.2/src/flowmesh_cli_stack.egg-info/requires.txt +5 -0
- flowmesh_cli_stack-0.1.0/src/flowmesh_cli_stack.egg-info/requires.txt +0 -5
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/LICENSE +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/README.md +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/setup.cfg +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/__init__.py +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/docker-bake.hcl +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/bundle.py +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/worker.py +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/SOURCES.txt +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/dependency_links.txt +0 -0
- {flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/top_level.txt +0 -0
{flowmesh_cli_stack-0.1.0/src/flowmesh_cli_stack.egg-info → flowmesh_cli_stack-0.1.2}/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.2
|
|
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.2
|
|
10
|
+
Requires-Dist: flowmesh-sdk-stack==0.1.2
|
|
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.2"
|
|
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.2",
|
|
15
|
+
"flowmesh-sdk-stack==0.1.2",
|
|
16
16
|
"docker>=7.1.0",
|
|
17
17
|
"packaging>=24",
|
|
18
18
|
"pyyaml>=6.0.2",
|
{flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/.env.example
RENAMED
|
@@ -93,6 +93,13 @@ SSH_DEFAULT_IDLE_SEC=
|
|
|
93
93
|
SSH_MAX_TTL_SEC=
|
|
94
94
|
SSH_POLL_INTERVAL_SEC=
|
|
95
95
|
SSH_STOP_TIMEOUT_SEC=
|
|
96
|
+
SSH_MAX_CPU=
|
|
97
|
+
SSH_MAX_MEMORY=
|
|
98
|
+
SSH_MAX_PIDS=
|
|
99
|
+
# Whether to apply requested GPU limits to SSH tasks.
|
|
100
|
+
# If false, SSH tasks are allocated all available GPUs
|
|
101
|
+
# regardless of their resource requests.
|
|
102
|
+
ENABLE_SSH_GPU_LIMIT=false
|
|
96
103
|
|
|
97
104
|
# ==== General Settings ====
|
|
98
105
|
TZ=Asia/Singapore
|
|
@@ -166,11 +173,15 @@ NEBULA_API_TOKEN=
|
|
|
166
173
|
|
|
167
174
|
# ==== External Plugins ====
|
|
168
175
|
# Plugins are Python packages dropped under FLOWMESH_PLUGIN_DIR
|
|
169
|
-
# (
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
#
|
|
176
|
+
# (read-only at /app/plugins) and selected by FLOWMESH_PLUGINS as
|
|
177
|
+
# a comma-separated list of top-level module names. Each must
|
|
178
|
+
# expose `install()` returning a `HookBindings`.
|
|
179
|
+
# FLOWMESH_PLUGIN_DATA_DIR is writable at /app/plugin-data for
|
|
180
|
+
# plugin state. Leave all empty unless you ship a plugin.
|
|
173
181
|
FLOWMESH_PLUGIN_DIR=./plugins
|
|
182
|
+
# A path (`./x`, `/abs/x`) -> host bind-mount (auto-created).
|
|
183
|
+
# A bare name -> external Docker volume of that name.
|
|
184
|
+
FLOWMESH_PLUGIN_DATA_DIR=./plugin-data
|
|
174
185
|
FLOWMESH_PLUGINS=
|
|
175
186
|
|
|
176
187
|
# ==== Agent Executor (youtu-agent / utu) ====
|
{flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/compose.yml
RENAMED
|
@@ -166,6 +166,7 @@ services:
|
|
|
166
166
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
167
167
|
- ${SERVER_WORKER_CONFIG:-./configs/worker_config.yaml}:/etc/flowmesh/worker_config.yaml:ro
|
|
168
168
|
- ${FLOWMESH_PLUGIN_DIR:-./plugins}:/app/plugins:ro
|
|
169
|
+
- ${FLOWMESH_PLUGIN_DATA_DIR:-./plugin-data}:/app/plugin-data
|
|
169
170
|
- ${REDIS_TLS_DIR:-./secrets/tls/redis}:/etc/ssl/redis:ro
|
|
170
171
|
- ${SERVER_TLS_DIR:-./secrets/tls/server}:/etc/ssl/server:ro
|
|
171
172
|
restart: unless-stopped
|
|
@@ -199,3 +200,6 @@ volumes:
|
|
|
199
200
|
name: ${FLOWMESH_STACK_SLUG:-flowmesh_node}_metrics
|
|
200
201
|
flowmesh_server_logs:
|
|
201
202
|
name: ${FLOWMESH_STACK_SLUG:-flowmesh_node}_server_logs
|
|
203
|
+
flowmesh_plugin_data:
|
|
204
|
+
external: true
|
|
205
|
+
name: ${FLOWMESH_PLUGIN_DATA_VOLUME:-${FLOWMESH_STACK_SLUG:-flowmesh_node}_plugin_data}
|
|
@@ -301,6 +301,24 @@ STACK_ENV_SCHEMA = EnvSchema(
|
|
|
301
301
|
EnvVar("SSH_MAX_TTL_SEC", var_type=EnvVarType.FLOAT, min_value=0),
|
|
302
302
|
EnvVar("SSH_POLL_INTERVAL_SEC", var_type=EnvVarType.FLOAT, min_value=0),
|
|
303
303
|
EnvVar("SSH_STOP_TIMEOUT_SEC", var_type=EnvVarType.FLOAT, min_value=0),
|
|
304
|
+
EnvVar(
|
|
305
|
+
"SSH_MAX_CPU",
|
|
306
|
+
var_type=EnvVarType.FLOAT,
|
|
307
|
+
min_value=0,
|
|
308
|
+
min_inclusive=False,
|
|
309
|
+
),
|
|
310
|
+
EnvVar("SSH_MAX_MEMORY"),
|
|
311
|
+
EnvVar("SSH_MAX_PIDS", var_type=EnvVarType.INT, min_value=1),
|
|
312
|
+
EnvVar(
|
|
313
|
+
"ENABLE_SSH_GPU_LIMIT",
|
|
314
|
+
"false",
|
|
315
|
+
var_type=EnvVarType.BOOL,
|
|
316
|
+
description=[
|
|
317
|
+
"Whether to apply requested GPU limits to SSH tasks.",
|
|
318
|
+
"If false, SSH tasks are allocated all available GPUs",
|
|
319
|
+
"regardless of their resource requests.",
|
|
320
|
+
],
|
|
321
|
+
),
|
|
304
322
|
],
|
|
305
323
|
),
|
|
306
324
|
EnvSection(
|
|
@@ -512,10 +530,11 @@ STACK_ENV_SCHEMA = EnvSchema(
|
|
|
512
530
|
title="External Plugins",
|
|
513
531
|
description=[
|
|
514
532
|
"Plugins are Python packages dropped under FLOWMESH_PLUGIN_DIR ",
|
|
515
|
-
"(
|
|
516
|
-
"
|
|
517
|
-
"
|
|
518
|
-
"
|
|
533
|
+
"(read-only at /app/plugins) and selected by FLOWMESH_PLUGINS as ",
|
|
534
|
+
"a comma-separated list of top-level module names. Each must ",
|
|
535
|
+
"expose `install()` returning a `HookBindings`. ",
|
|
536
|
+
"FLOWMESH_PLUGIN_DATA_DIR is writable at /app/plugin-data for ",
|
|
537
|
+
"plugin state. Leave all empty unless you ship a plugin.",
|
|
519
538
|
],
|
|
520
539
|
vars=[
|
|
521
540
|
EnvVar(
|
|
@@ -525,6 +544,15 @@ STACK_ENV_SCHEMA = EnvSchema(
|
|
|
525
544
|
use_default=True,
|
|
526
545
|
ensure_path="create",
|
|
527
546
|
),
|
|
547
|
+
EnvVar(
|
|
548
|
+
"FLOWMESH_PLUGIN_DATA_DIR",
|
|
549
|
+
"./plugin-data",
|
|
550
|
+
use_default=True,
|
|
551
|
+
description=[
|
|
552
|
+
"A path (`./x`, `/abs/x`) -> host bind-mount (auto-created).",
|
|
553
|
+
"A bare name -> external Docker volume of that name.",
|
|
554
|
+
],
|
|
555
|
+
),
|
|
528
556
|
EnvVar("FLOWMESH_PLUGINS", ""),
|
|
529
557
|
],
|
|
530
558
|
),
|
|
@@ -35,6 +35,7 @@ from .env_schema import STACK_ENV_SCHEMA, deploy_overrides, role_overrides
|
|
|
35
35
|
from .utils import (
|
|
36
36
|
DEFAULT_ENV_FILE,
|
|
37
37
|
STACK_PATH_KEYS,
|
|
38
|
+
apply_plugin_data_env,
|
|
38
39
|
apply_stack_resource_env,
|
|
39
40
|
ensure_deploy_paths,
|
|
40
41
|
parse_node_role,
|
|
@@ -58,6 +59,7 @@ def _stack() -> DockerComposeStack:
|
|
|
58
59
|
except ValueError as exc:
|
|
59
60
|
logging.error(str(exc))
|
|
60
61
|
raise typer.Exit(code=1)
|
|
62
|
+
apply_plugin_data_env(Path.cwd())
|
|
61
63
|
|
|
62
64
|
return DockerComposeStack(
|
|
63
65
|
compose_file=stack_compose_file(),
|
|
@@ -57,6 +57,22 @@ def apply_stack_resource_env() -> None:
|
|
|
57
57
|
os.environ[WORKER_RESULTS_DIR_ENV] = results_volume
|
|
58
58
|
|
|
59
59
|
|
|
60
|
+
_PLUGIN_DATA_PATH_PREFIXES = ("/", "./", "../", "~")
|
|
61
|
+
_PLUGIN_DATA_ALIAS = "flowmesh_plugin_data"
|
|
62
|
+
_PLUGIN_DATA_DEFAULT = "./plugin-data"
|
|
63
|
+
_PLUGIN_DATA_VOLUME_ENV = "FLOWMESH_PLUGIN_DATA_VOLUME"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def apply_plugin_data_env(base_dir: Path) -> None:
|
|
67
|
+
raw = os.environ.get("FLOWMESH_PLUGIN_DATA_DIR", "").strip()
|
|
68
|
+
if not raw or raw.startswith(_PLUGIN_DATA_PATH_PREFIXES):
|
|
69
|
+
resolved = resolve_path(raw, default=_PLUGIN_DATA_DEFAULT, base_dir=base_dir)
|
|
70
|
+
os.environ["FLOWMESH_PLUGIN_DATA_DIR"] = resolved.as_posix()
|
|
71
|
+
else:
|
|
72
|
+
os.environ[_PLUGIN_DATA_VOLUME_ENV] = raw
|
|
73
|
+
os.environ["FLOWMESH_PLUGIN_DATA_DIR"] = _PLUGIN_DATA_ALIAS
|
|
74
|
+
|
|
75
|
+
|
|
60
76
|
def stack_compose_file() -> Path:
|
|
61
77
|
return asset_path("flowmesh_cli_stack.assets", "compose.yml")
|
|
62
78
|
|
|
@@ -118,6 +134,14 @@ def ensure_deploy_paths(base_dir: Path) -> None:
|
|
|
118
134
|
base_dir=base_dir,
|
|
119
135
|
)
|
|
120
136
|
)
|
|
137
|
+
if not os.environ.get(_PLUGIN_DATA_VOLUME_ENV):
|
|
138
|
+
ensure_dir(
|
|
139
|
+
resolve_path(
|
|
140
|
+
os.getenv("FLOWMESH_PLUGIN_DATA_DIR", ""),
|
|
141
|
+
default=_PLUGIN_DATA_DEFAULT,
|
|
142
|
+
base_dir=base_dir,
|
|
143
|
+
)
|
|
144
|
+
)
|
|
121
145
|
|
|
122
146
|
|
|
123
147
|
def parse_node_role(raw: str) -> NodeRole:
|
{flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2/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.2
|
|
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.2
|
|
10
|
+
Requires-Dist: flowmesh-sdk-stack==0.1.2
|
|
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
|
|
File without changes
|
{flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack/assets/docker-bake.hcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{flowmesh_cli_stack-0.1.0 → flowmesh_cli_stack-0.1.2}/src/flowmesh_cli_stack.egg-info/top_level.txt
RENAMED
|
File without changes
|