Repository navigation
Refuse a bad --source-schema with PRECONDITION and add migrate --data-schema (S-007-12, S-007-13) - #169
Merged
Conversation
…-schema A schema name must match ^[a-z_][a-z0-9_]*$ and be at most 63 characters, and may be named once; a malformed or repeated name now exits PRECONDITION from the command before any playbook, as spec 007 says, where it was a usage error and a repeat was silently dropped. cloudfall migrate takes --data-schema DATABASE=NAME beside --data, so the data step copies only the named schemas as data copy --source-schema does; one for a database with no --data is refused before any step (S-007-12, S-007-13). Fixes #126 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pending step of a persisted plan kept the description it was saved with, so a data step saved with --data-schema crm=public and resumed without it reported "schema public" while it copied every schema (#126, S-007-13). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
shipmill-romamo Bot
added a commit
that referenced
this pull request
Oct 30, 2026
…11) (#171) * Accept a command health check in the component schema (#170) A component can declare healthCheck type: command (command argv, timeoutSeconds 1-300, attempts 1-20, no other key). The SDK parses it into value objects and the deploy, restart and rollback plans name the check and its command in wouldRun; the plan JSON gains no field (S-009-1, S-009-13). The engine does not run the check yet (#164), so the deploy role's entry points refuse a command check on their first task instead of passing an unrun gate. Fixes #161 Co-authored-by: shipmill-romamo[bot] <338557544+shipmill-romamo[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Refuse a bad --source-schema with PRECONDITION and add migrate --data-schema (S-007-12, S-007-13) (#169) * Refuse a bad --source-schema with PRECONDITION and add migrate --data-schema A schema name must match ^[a-z_][a-z0-9_]*$ and be at most 63 characters, and may be named once; a malformed or repeated name now exits PRECONDITION from the command before any playbook, as spec 007 says, where it was a usage error and a repeat was silently dropped. cloudfall migrate takes --data-schema DATABASE=NAME beside --data, so the data step copies only the named schemas as data copy --source-schema does; one for a database with no --data is refused before any step (S-007-12, S-007-13). Fixes #126 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Describe a resumed migrate step by this run's options A pending step of a persisted plan kept the description it was saved with, so a data step saved with --data-schema crm=public and resumed without it reported "schema public" while it copied every schema (#126, S-007-13). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: shipmill-romamo[bot] <338557544+shipmill-romamo[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Validate Domain routes (S-003-1, S-003-8..12) (#168) * Validate Domain routes (S-003-1, S-003-8..12) A Domain can now declare spec.routes: proxy routes (path + upstream) and static routes (path + static component, directory, spaFallback). The schema holds each route's shape and the release-relative directory and fallback; config validate checks the route source, path syntax, reserved and duplicate paths, and that a static component exists and is deployed on the proxy server. The inventory parses routes into value objects and serializes them only when present, so a Domain with only proxy.upstream is unchanged. Rendering routes comes with #162. Fixes #159 Part of #90 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refuse a trailing newline in a static route's directory or spaFallback The releasePath schema pattern ends with $, which Python's re.search lets match before one trailing newline, so config validate accepted directory: "web\n" that ReleaseRelativePath then refused with a ValueError when the inventory loaded. Refuse control characters in the schema, as component.schema.json's controlCharacterFree does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: shipmill-romamo[bot] <338557544+shipmill-romamo[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Refuse a data copy the target can't hold before dumping it A preflight on the target host, after the empty-target check and before pg_dump, reads the source and target catalogs and names every schema the source lacks, extension and policy role the target lacks, and auth. reference, taking every name only as a psql variable. Any finding refuses the copy with nothing dumped: data copy and migrate's data step exit PRECONDITION with data_copy_preflight_refused and the four lists, read whole from a findings file under --data-migrations. pg_dump takes the needed extensions with named schemas, and pg_restore runs in one transaction, so a failed restore leaves no table and no receipt. Spec 007 is built (S-007-6 to S-007-11). Fixes #125 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: shipmill-romamo[bot] <338557544+shipmill-romamo[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Builds S-007-12 and S-007-13 of
docs/specs/007-data-copy-schemas.md.PostgresSchemaNamenow takes exactly the spec's names:^[a-z_][a-z0-9_]*$, at most 63 characters (read withfullmatch, so a trailing newline can't pass). Braces, quotes, semicolons and control characters fall outside it, so the Copy only the named schemas in data copy (#124) #134 guard against Ansible templating stays.DataCopySchemasrefuses a name given twice instead of silently dropping the repeat.--source-schema(CLI and thedata_copyMCP tool) now exitsPRECONDITION(exit 4, context codedata_copy_schema_invalid) from the command, before any playbook, as the spec's Behaviour and S-007-12 say. Since Copy only the named schemas in data copy (#124) #134 it was a usage error (exit 2) raised fromDataMigrateArgs.__post_init__. One exception: a value holding a newline is still refused by the CLI framework's own argv guard asARG_ERROR(exit 2) before the command runs; no playbook runs either way.cloudfall migrate --data-schema DATABASE=NAME(repeatable, MCPdata_schema) narrows thedata:<database>step to the named schemas, passing the sameDataCopySchemastomigrate_datathatdata copy --source-schemadoes; the plan step's description names them. A--data-schemafor a database with no--dataexitsPRECONDITIONwith codemigrate_data_schema_without_data, in plan mode as with--yes, before any step. A--data-schemavalue without=is a usage error, as a malformed--dataalready is.--data-schema.Plan
data_copyandmigratetools, S-007-13 on the migrate data step's playbook argv), thenPostgresSchemaNameto^[a-z_][a-z0-9_]*$and at most 63 characters,DataCopySchemasrefusing a repeat, both answered asPRECONDITIONin the command instead of a usage error, thenmigrate --data-schema DATABASE=NAMEthroughMigrateOptionsto thedata:<database>step; Behaviour as in spec 007, "Choosing the schemas"Test plan
test_s007_12_data_copy_refuses_a_malformed_or_repeated_schema(Bad;Name,app app, empty, Jinja, tab, upper case, leading digit, quote, 64 characters; with and without--yes: exit 4, no inventory render),test_s007_12_data_copy_takes_the_longest_schema_name,test_s007_12_cli_migrate_refuses_a_bad_data_schema_before_any_playbook(no--data, malformed, repeated; with--yes: no plan file, no inventory),test_s007_12_migrate_refuses_a_data_schema_without_its_data(no engine step started),test_s007_12_data_copy_schemas_refuse_a_repeat_and_a_malformed_name,test_s007_12_the_data_tools_refuse_a_bad_schema_as_the_cli_does(over the real MCP stdio transport)test_s007_13_migrate_copies_only_the_data_schema_as_data_copy_does(the resumed data step's playbook argv equalsdata copy --source-schema public's),test_s007_13_migrate_groups_each_data_schema_under_its_databaseuv run ruff check .,uv run mypy,ansible-lint engine/ansible, and the touched test files pass locally; the full suite is left to CIFixes #126
🤖 Generated with Claude Code