Add ansible virtual repositories #158

Merged
benvin merged 22 commits from benvin/virtual-ansible into master 2026-10-18 18:09:09 +11:00
Member

Clients need one Galaxy server to install both internal collections and galaxy.ansible.com ones; ansible has no virtual type.

  • merge member collection version lists in member order, the earlier member winning a duplicate version, cached with the shared virtual merge cache
  • paginate limit/offset over the merged list, following remote member pages
  • serve version detail from the owning member with href and download_url via the virtual; downloads 302 to the member through the member-redirect validation
  • fail closed with 502 on a member error or a member versions list shorter than its count
  • add docs/ansible/virtual.md and an e2e-docker case driving real ansible-galaxy

requires unkin/artifactapi#157

Clients need one Galaxy server to install both internal collections and galaxy.ansible.com ones; ansible has no virtual type. - merge member collection version lists in member order, the earlier member winning a duplicate version, cached with the shared virtual merge cache - paginate limit/offset over the merged list, following remote member pages - serve version detail from the owning member with href and download_url via the virtual; downloads 302 to the member through the member-redirect validation - fail closed with 502 on a member error or a member versions list shorter than its count - add docs/ansible/virtual.md and an e2e-docker case driving real ansible-galaxy requires unkin/artifactapi#157
Author
Member
  • nit: internal/virtual/ansible_merger.go:163 — a remote page with empty data while len(m.Refs) < meta.count returns the partial list as complete, contradicting fail-closed → return an error in that case.
  • nit: internal/virtual/ansible_merger.go:19 — cache is capped by collection count (1024 per virtual, cur+prev each, plus body duplicating Refs), not size; 10k-version collections make that large → drop the redundant body (e.g. index from a version-count/hash) or cap by total refs.
- nit: internal/virtual/ansible_merger.go:163 — a remote page with empty `data` while `len(m.Refs) < meta.count` returns the partial list as complete, contradicting fail-closed → return an error in that case. - nit: internal/virtual/ansible_merger.go:19 — cache is capped by collection count (1024 per virtual, cur+prev each, plus `body` duplicating `Refs`), not size; 10k-version collections make that large → drop the redundant `body` (e.g. index from a version-count/hash) or cap by total refs.
Author
Member

No findings.

No findings.
benvin changed target branch from benvin/local-ansible to master 2026-10-18 18:01:40 +11:00
benvin added 21 commits 2026-10-18 18:01:40 +11:00
Add ansible Galaxy remote type
ci/woodpecker/pr/build Pipeline failed
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
13d693b58a
- add ansible package type proxying the Galaxy v3 API
- rewrite href/links/download_url back to the remote so tarballs flow through it
- forward the query string for providers that opt in, keeping Galaxy pagination working
- add a UI usage snippet and an ansible e2e caching case
Retrigger CI
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
0f826aa331
Forward allowlisted query params for opt-in remote providers
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
586b07bab6
Document ansible pagination and artifact paths
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
9935691c6b
Classify bare paths, validate forwarded query values, evict query variants
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
769d673a4a
Validate and cap ansible pagination params
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
285e8674ca
Merge master into benvin/remote-query-forwarder
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
71e6458c77
Merge benvin/remote-query-forwarder into benvin/remote-ansible
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
f4d3093952
Add local ansible Galaxy repositories
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ba8d3a3c39
Add ansible virtual repositories
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
4b202b1852
List ansible in the per-type caching docs
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
583a3ad4d1
Merge remote-tracking branch 'origin/benvin/remote-ansible' into benvin/local-ansible
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
e27a318ec7
Fail virtual ansible merges on a short member versions list
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
c1a5feb64e
Expect root-relative pagination links from ansible virtuals
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
41008cd8f6
Merge remote-tracking branch 'origin/master' into benvin/local-ansible
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
029a6926fd
# Conflicts:
#	README.md
#	ui/src/packagetypes/defs/ansible.ts
Merge remote-tracking branch 'origin/benvin/local-ansible' into benvin/virtual-ansible
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
4c2d717437
unkin-agent added 1 commit 2026-10-18 18:03:13 +11:00
Merge remote-tracking branch 'origin/master' into benvin/virtual-ansible
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
cb2ad11b89
# Conflicts:
#	README.md
#	internal/api/v1/ansible_handler_test.go
benvin merged commit 0cfde41612 into master 2026-10-18 18:09:09 +11:00
benvin deleted branch benvin/virtual-ansible 2026-10-18 18:09:09 +11:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unkin/artifactapi#158