Repository navigation
feat(cloud-init): user-data-node.yaml and user-data-publisher.yaml with an origin node - #134
Merged
Merged
Conversation
3 tasks done
There was a problem hiding this comment.
🟡 Changes recommended
Origin linting accepts incomplete backends, and two operator-facing instructions are misleading.
2 open findings
What changed in this PR
Introduces operator-specific cloud-init paths for cache-node and publisher deployments, with publisher hosts now including an origin node.
Changes:
- Renames cloud-init templates and Molecule coverage around node/publisher personas.
- Adds origin inventory validation, secret gating, and deployment coverage.
- Updates documentation, CI references, and script tests.
| File | Description |
|---|---|
tests/scripts-test.sh |
Updates template names and origin checks. |
README.md |
Documents the new templates. |
Makefile |
Updates cloud-init lint inputs. |
CONTRIBUTING.md |
Updates command and scenario documentation. |
cloud-init/user-data-publisher.yaml |
Adds the publisher origin node inventory. |
cloud-init/user-data-node.yaml |
Reframes the node template as cache-only. |
cloud-init/tests/lint.py |
Adds origin membership and backend validation. |
cloud-init/README.md |
Documents publisher deployment and secrets. |
cloud-init/bootstrap.sh |
Adds origin membership, baseline, and secret handling. |
ansible/roles/sponsord/README.md |
Renames publisher Molecule coverage. |
ansible/roles/sponsord_onramp/README.md |
Renames publisher Molecule coverage. |
ansible/README.md |
Updates scenario naming. |
ansible/molecule/cloud-init/prepare.yml |
Updates shared-scenario references. |
ansible/molecule/cloud-init/molecule.yml |
Updates node template references. |
ansible/molecule/cloud-init/includes/refuse.yml |
Updates publisher scenario references. |
ansible/molecule/cloud-init/converge.yml |
Boots the renamed node template. |
ansible/molecule/cloud-init-publisher/verify.yml |
Verifies the origin node and backend. |
ansible/molecule/cloud-init-publisher/side_effect.yml |
Tests origin guards and node secrets. |
ansible/molecule/cloud-init-publisher/prepare.yml |
Creates separate signed release mirrors. |
ansible/molecule/cloud-init-publisher/molecule.yml |
Defines publisher scenario behavior. |
ansible/molecule/cloud-init-publisher/converge.yml |
Boots and configures the publisher template. |
ansible/Makefile |
Renames the slow Molecule scenario. |
AGENTS.md |
Updates repository cloud-init guidance. |
.github/workflows/molecule.yml |
Updates scenario timing documentation. |
.github/workflows/ci.yml |
Updates cloud-init CI documentation. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
thiras
force-pushed
the
feat/origin-nodes-entry-points
branch
from
October 10, 2026 16:43
d5960bc to
d9a75ed
Compare
thiras
force-pushed
the
feat/cloud-init-personas
branch
from
October 10, 2026 16:45
1818a58 to
799ba39
Compare
thiras
force-pushed
the
feat/origin-nodes-entry-points
branch
from
October 10, 2026 17:10
d9a75ed to
c4009a9
Compare
thiras
force-pushed
the
feat/cloud-init-personas
branch
from
October 10, 2026 17:10
799ba39 to
c2c5729
Compare
…th an origin node One template per kind of operator. user-data.yaml becomes user-data-node.yaml (node operators: a cache node), and user-data-sponsord.yaml becomes user-data-publisher.yaml (publishers: an origin node, sponsord and its onramp on one host, each group deletable). The publisher template lists localhost in decdn_nodes and decdn_origin_nodes as siblings, with an http origin backend to fill in. bootstrap.sh learns the group: it refuses an origin outside decdn_nodes, checks an origin's baseline play as decdn_origin_nodes (its play is origin.yml's, not node.yml's), and tells an S3 origin where its keys go. lint.py refuses an origin without decdn_nodes or without a backend. The cloud-init-sponsord scenario becomes cloud-init-publisher and boots the origin too, from a decdn/decdn and a decdn/sponsord release under their own mirror bases, and checks the backend in node.toml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the S3 key hint lint.py took any non-empty decdn_cache_origin_kind (or list) as a backend, so a typo'd kind, an http origin without its URL or an empty list entry passed and failed only after the host waited for its secrets. It now checks each kind's required fields, as roles/decdn_node does. The login hint printed the two AWS keys on one line, which is one invalid entry in an EnvironmentFile; it now prints one per line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
thiras
force-pushed
the
feat/cloud-init-personas
branch
from
October 10, 2026 17:38
c2c5729 to
88accfa
Compare
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
Stacked on #133 (which is stacked on #130). One cloud-init template per kind of operator:
user-data.yaml→user-data-node.yamlfor node operators: a cache node.user-data-sponsord.yaml→user-data-publisher.yamlfor publishers: an origin node, sponsord and its onramp on one VM. Each group can be deleted.decdn_nodesanddecdn_origin_nodesas siblings, because the lint refuseschildren:.bootstrap.sh:decdn_nodes;decdn_origin_nodes, because its play isorigin.yml's, notnode.yml'sdecdn_nodes:!decdn_origin_nodes;decdn.env;decdn_origin_nodesno secrets of its own.lint.py:decdn_nodes;decdn_origin_nodes.vars.Molecule:
cloud-init-sponsordis renamedcloud-init-publisher. It now also boots the origin node:decdn_nodes;decdn-nodeis running and thatnode.toml's[cache.origin]is the configured http backend.Test plan
make lint-cloud-initmake test-scripts. New lint negatives: origin withoutdecdn_nodes, origin without a backend, origin node from source, S3 keys in the origin vars. Plusbaseline-plays.shon the publisher template's host, and the relaxed hint-arm check.make lint,ansible-lintmake molecule SCENARIOS='cloud-init cloud-init-publisher': both 7/7Downstream
internal-devops: a renamed molecule scenario or template that it references needs the same rename.
🤖 Generated with Claude Code