feat: v0.3.1 — create_project tool
Adds `create_project` for registering a new Container Manager project
from a compose YAML string. Three-step flow that mirrors the DSM
"Create Project" wizard:
1. SYNO.FileStation.CreateFolder with force_parent=true (idempotent
— does not fail if the folder already exists, and creates missing
intermediate directories). Without this step, Docker.Project/create
fails with DSM error 2100.
2. SYNO.Docker.Project/create (form-encoded POST; JSON-encoded string
parameters per DSM convention) returns the new project UUID.
3. trigger_build_stream + _wait_for_project_running, reusing the
existing image-pull / start / poll machinery (including the
BUILD_FAILED early-exit from welle 2).
Safety:
- Project-name validation (Welle-1 regex) runs before any I/O.
- Compose content is YAML-parsed and must contain a top-level
`services` key before any side effects.
- A pre-flight list_projects check rejects duplicate names with a
clear message rather than leaving an orphaned folder on the NAS.
- share_path defaults to compose_base_path + project_name (e.g.
/volume1/docker + myapp → /docker/myapp); a caller-supplied value
overrides it.
- Requires confirmed=True; the preview shows the resolved share path
and the service count parsed from the compose content.
- DSM error 2100 surfaces as "target folder issue" with the attempted
path. A build_stream failure after a successful Project/create tells
the user the project is registered-but-not-started and points at
redeploy_project for recovery.
Tests cover preview-only, already-exists, happy path (with parameter
JSON-encoding assertions), explicit share_path, malformed YAML,
missing services key, invalid project name, error 2100, and
build_stream failure after registration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+26
-1
@@ -2,7 +2,32 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [0.3.0] - 2026-05-18
|
||||
## [0.3.1] - 2026-05-18
|
||||
|
||||
### Added
|
||||
|
||||
- `create_project` — register a new Container Manager project from a
|
||||
compose YAML string. Three-step flow:
|
||||
1. Create the target folder via `SYNO.FileStation.CreateFolder` with
|
||||
`force_parent=true` (idempotent — does not fail if the folder
|
||||
already exists, and creates missing intermediate directories).
|
||||
Without this step, `SYNO.Docker.Project/create` fails with DSM
|
||||
error code 2100.
|
||||
2. `SYNO.Docker.Project/create` (form-encoded POST, JSON-encoded
|
||||
string parameters per DSM convention) returns the new project's
|
||||
UUID.
|
||||
3. `trigger_build_stream` + `_wait_for_project_running` — reuses the
|
||||
existing image-pull / start / poll machinery (including the
|
||||
`BUILD_FAILED` early-exit from welle 2).
|
||||
Defaults: `share_path` is derived from `compose_base_path` (e.g.
|
||||
`/volume1/docker` + `myapp` → `/docker/myapp`). The compose content
|
||||
is validated as YAML before any side effects. A pre-flight
|
||||
`list_projects` check rejects duplicate names with a clear message
|
||||
rather than leaving an orphaned folder on the NAS. Requires
|
||||
`confirmed=True`; the preview shows the resolved share path and the
|
||||
service count parsed from the compose content.
|
||||
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
Reference in New Issue
Block a user