Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
8de41ea
chore: add reqsign workspace dependencies for azure
tenzinplatter Jun 11, 2026
c2a8875
feat(index): add azure feature enabling opendal azblob
tenzinplatter Jun 11, 2026
d138be1
feat(config): add AzureOptions and AzureOptionsMap
tenzinplatter Jun 11, 2026
7c1ee72
feat(config): wire azure-options into ConfigBase
tenzinplatter Jun 11, 2026
90f434f
feat(networking): add azure feature deps
tenzinplatter Jun 11, 2026
9988ce0
feat(networking): add AzureMiddleware url rewriting
tenzinplatter Jun 11, 2026
a4d264d
feat(networking): sign az requests via reqsign
tenzinplatter Jun 11, 2026
a4fbf11
feat(bin): register AzureMiddleware behind azure feature
tenzinplatter Jun 11, 2026
0cda396
feat(index): add azure indexing functions
tenzinplatter Jun 11, 2026
175aa10
feat(index): add rattler-index azure subcommand
tenzinplatter Jun 11, 2026
464031a
fix(index): satisfy clippy for azblob_config
tenzinplatter Jun 11, 2026
b4b24d9
feat(upload): add azure feature
tenzinplatter Jun 11, 2026
3cc485d
feat(upload): add upload_package_to_azure
tenzinplatter Jun 11, 2026
4edb5ce
feat(upload): add azure server type and dispatch
tenzinplatter Jun 11, 2026
444c027
feat(bin): enable rattler_upload azure passthrough
tenzinplatter Jun 11, 2026
feb3f6f
fix(upload): satisfy clippy in azure upload
tenzinplatter Jun 11, 2026
9bfca47
test(index): add azurite azure integration test
tenzinplatter Jun 12, 2026
6c26b8b
docs(azure): document azure blob channel support
tenzinplatter Jun 12, 2026
7a9eab2
chore(azure): polish header value and help text
tenzinplatter Jun 12, 2026
12df59a
test(networking): add azurite azure middleware fetch test
tenzinplatter Jun 12, 2026
72fe5ff
test(networking): add real-azure AAD middleware fetch test
tenzinplatter Jun 12, 2026
afaf2be
feat(rattler_index): add Azure Blob backend (#2)
tenzinplatter Jul 17, 2026
f57e47f
feat: azure index md5 (#3)
tenzinplatter Jul 20, 2026
dcd620e
chore(azure): merge main, adopt rattler_azure structure
tenzinplatter Jul 21, 2026
3f45d55
feat(upload): add azure upload path on AzureCredentials
tenzinplatter Jul 21, 2026
425b46a
feat(networking): add azure fetch middleware
tenzinplatter Jul 21, 2026
731450d
Merge branch 'worktree-agent-ac36b54efc26e1304' into feat/azure-blob-…
tenzinplatter Jul 21, 2026
4d5f5c2
Merge branch 'worktree-agent-a489e4b9e5d5da31c' into feat/azure-blob-…
tenzinplatter Jul 21, 2026
b55a4a2
feat(bin): enable azure feature and register AzureMiddleware
tenzinplatter Jul 21, 2026
895bf15
fix(azure): address review findings (host validation, enum config, st…
tenzinplatter Jul 21, 2026
67f27df
feat(azure): mint user-delegation SAS from az login for write paths
tenzinplatter Jul 21, 2026
18b740d
fix(azure): typed auth source, configurable SAS ttl, windows az, dedu…
tenzinplatter Jul 22, 2026
79e10ca
test(networking): live az-login azure fetch against real account
tenzinplatter Jul 22, 2026
7da64ce
feat(gateway): accept az:// channel scheme
tenzinplatter Jul 22, 2026
25fe5da
fix(gateway): honor 304 on shard index revalidation
tenzinplatter Jul 22, 2026
d9e4334
refactor(azure): address az:// by full blob host, drop config layer
tenzinplatter Jul 22, 2026
02641fd
fix(networking): send az:// unsigned on no credential, skip pre-signe…
tenzinplatter Jul 22, 2026
50b8903
fix(gateway): synthesize shard-index freshness and persist refreshed …
tenzinplatter Jul 22, 2026
67a6ee4
refactor(index,upload): validate az URLs via rattler_azure::account_a…
tenzinplatter Jul 22, 2026
0c40651
docs(index): document URL-derived azure model, drop removed azure-opt…
tenzinplatter Jul 22, 2026
f6bcf0d
refactor(azure): typed coordinates, key/SAS exclusion, TTL cap, drop …
tenzinplatter Jul 22, 2026
29dfa2b
feat(py): add azure middleware bindings
tenzinplatter Jul 23, 2026
c6eaf26
fix(index): hoist nested async fn above statements in test
tenzinplatter Jul 23, 2026
4ba47b6
fix(azure): reject userinfo, gate az coord charset, invoke az directl…
tenzinplatter Jul 23, 2026
36bd739
fix(azure): reject az:// userinfo and error on broken credential
tenzinplatter Jul 23, 2026
fab4ec4
fix(azure): stat-guard overwrites, warn on unmetadata'd block uploads…
tenzinplatter Jul 23, 2026
8534159
fix(gateway): carry forward storable policy on shard index 304
tenzinplatter Jul 23, 2026
e334533
fix(py): register AzureMiddleware in default client
tenzinplatter Jul 23, 2026
0a6b504
refactor(azure): async SAS mint via tokio::process, gate s3-only Hash…
tenzinplatter Jul 23, 2026
b6c3441
feat(azure): treat persisted az login profile as a credential source
tenzinplatter Jul 23, 2026
c87d826
perf(azure): skip credential resolution when no source detected
tenzinplatter Jul 23, 2026
e747852
refactor(azure): drop unused blob metadata write from upload path
tenzinplatter Jul 23, 2026
401a71a
refactor(index): drop staleness re-index, restore upstream reconcilia…
tenzinplatter Jul 23, 2026
b7b1d94
Merge remote-tracking branch 'upstream/main' into feat/azure-blob-cha…
tenzinplatter Jul 23, 2026
eba1547
fix(ci): allowlist AKS in typos, refresh py-rattler lock
tenzinplatter Jul 23, 2026
6acc02f
fix(docs): unlink public->private intra-doc refs in azure crates
tenzinplatter Jul 23, 2026
03aafcc
feat(azure): accept az:// channel URLs in index/upload via shared par…
tenzinplatter Jul 24, 2026
f5bf06b
docs(index): use az:// scheme in azure examples, note https rejected
tenzinplatter Jul 24, 2026
f1e9b18
docs(index): reflow azure channel URL paragraph
tenzinplatter Jul 24, 2026
4c6c624
test(azure): use standard st-prefixed account name in fixtures
tenzinplatter Jul 24, 2026
55c0cae
refactor(azure): extract shared azblob_config into rattler_azure
tenzinplatter Jul 24, 2026
fd2b1e8
chore: update lock
tenzinplatter Jul 24, 2026
2b29682
chore: clean comment
tenzinplatter Jul 24, 2026
fe0dd80
feat: use `az` subcommand
tenzinplatter Jul 24, 2026
f01da0d
Merge remote-tracking branch 'upstream/main' into feat/azure-blob-cha…
tenzinplatter Jul 26, 2026
0627c7c
chore: update lockfile
tenzinplatter Jul 26, 2026
5ba93b6
fix: relock against upstream instead of downgrading deps
tenzinplatter Jul 27, 2026
c38c50a
Merge remote-tracking branch 'upstream/main' into feat/azure-blob-cha…
tenzinplatter Jul 31, 2026
ed92ba6
fix(upload): request SAS read permission and fail fast on azure upload
tenzinplatter Jul 31, 2026
8ba19c7
fix(azure): redact secrets in AzureAuthSource and AzureCredentialsOpt…
tenzinplatter Jul 31, 2026
95ffc0a
feat(config): add azure-options table for per-host endpoint grants
tenzinplatter Jul 31, 2026
b411d71
feat(azure): add AzureChannelUrl and AzureHost with normalized option…
tenzinplatter Jul 31, 2026
5b0a824
feat(networking): drive azure signing from azure-options grants
tenzinplatter Jul 31, 2026
f0fd17b
feat(azure): honour path-style addressing in index and upload plumbing
tenzinplatter Jul 31, 2026
874d79b
docs(azure): drop tool-branded comment prefixes
tenzinplatter Jul 31, 2026
d907711
fix(bin): forward rattler_upload tls and sigstore features, scope sha…
tenzinplatter Jul 31, 2026
c6482b5
test(azure): add azurite integration tests and e2e ci workflow
tenzinplatter Jul 31, 2026
cd8be49
fix(ci): drop unneeded azurite --skipApiVersionCheck and correct its …
tenzinplatter Aug 2, 2026
c10acc0
refactor(ci): run azurite as a service container with a health check
tenzinplatter Aug 2, 2026
ba70b11
refactor(bin): gate attestation behind a feature instead of the depen…
tenzinplatter Aug 3, 2026
0cce4a7
refactor(bin): drop attestation feature, keep sigstore-sign on the de…
tenzinplatter Aug 3, 2026
fcf06fd
revert(gateway): drop the shard-index Cache-Control synthesis
tenzinplatter Aug 3, 2026
494a6b0
fix(networking): gate the auth store to http and https
tenzinplatter Aug 3, 2026
16c41e1
fix(config): refuse cleartext grants to routable hosts and colliding …
tenzinplatter Aug 3, 2026
19db4df
feat(azure): accept path_style as an alias for path-style
tenzinplatter Aug 3, 2026
227aa20
fix(index): scope the url import to s3 and drop the dead typos entry
tenzinplatter Aug 3, 2026
7c86cc5
docs: correct false claims in the azure docs and comments
tenzinplatter Aug 3, 2026
68bc60c
docs: trim comments that do not carry their weight
tenzinplatter Aug 3, 2026
144f527
refactor: hold azure credentials in secrecy::SecretString
tenzinplatter Aug 3, 2026
d3ab472
fix(azure): reject rewritten paths, mismatched addressing, and port-l…
tenzinplatter Aug 5, 2026
d2c492a
refactor(upload): share one streaming blob writer between azure and s3
tenzinplatter Aug 5, 2026
30330fa
test(azure): assert the outgoing request carries no credential
tenzinplatter Aug 5, 2026
2434522
test(git): isolate the lfs fixture from a developer global gitignore
tenzinplatter Aug 5, 2026
8d640cf
refactor(azure): give the fetch and write paths types that carry only…
tenzinplatter Aug 5, 2026
f9cab6a
fix(azure): refuse path segments that cannot name a blob
tenzinplatter Aug 5, 2026
b70dd87
fix(azure): warn instead of erroring on path-style for a real Azure host
tenzinplatter Aug 5, 2026
1efe9c5
fix(azure): keep the SAS signature out of storage error messages
tenzinplatter Aug 5, 2026
e32d100
test(azure): give the emulator tests teeth and stop them vanishing
tenzinplatter Aug 5, 2026
aee4df4
fix(azure): say which host and grant a failed credential resolution c…
tenzinplatter Aug 5, 2026
dda4cc7
refactor: tighten azure names into types and dedupe the 404 hint
tenzinplatter Aug 5, 2026
a4540ec
feat: let callers write and revoke azure host grants
tenzinplatter Aug 5, 2026
cd7701f
fix: trust a bare 304 when revalidating a shard index
tenzinplatter Aug 5, 2026
4d7f171
feat: key azure-options auth grants per container
tenzinplatter Aug 6, 2026
1ebf8ec
docs: correct stale per-host wording in azure grant docs
tenzinplatter Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions .github/workflows/e2e-azure-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
on:
push:
branches: [main]
pull_request:
paths:
- crates/rattler_azure/**
- crates/rattler_config/**
- crates/rattler_index/**
- crates/rattler_networking/**
- crates/rattler_upload/**
# An opendal bump touches only the root manifest, and these tests are the
# canary for the opendal bug the upload path works around.
- Cargo.toml
- Cargo.lock
- test-data/**
- pixi.toml
- pixi.lock
- .github/workflows/e2e-azure-tests.yml

name: E2E Azure Tests

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false

env:
RUST_LOG: info
RUST_BACKTRACE: 1
CARGO_TERM_COLOR: always

jobs:
e2e-azurite-test:
name: E2E Index/Fetch [Azurite]
runs-on: ubuntu-latest

env:
# Enable sccache.
#
# This environment variable is picked up by pixi build which will then
# set up the rust build using sccache.
SCCACHE_GHA_ENABLED: "true"

# No secrets: the emulator's `devstoreaccount1` credentials are published
# constants, spelled out in the tests, and only ever reach loopback.
services:
azurite:
image: mcr.microsoft.com/azure-storage/azurite:3.36.0
ports:
- 10000:10000
options: >-
--health-cmd "nc -z 127.0.0.1 10000"
--health-interval 2s
--health-timeout 2s
--health-retries 30

steps:
- name: Checkout source code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
submodules: recursive

- uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
with:
environments: default

- name: Run the Azurite integration tests
run: |
pixi run -vv -- cargo nextest run --run-ignored all \
--features rattler_networking/azure \
-p rattler_index --test azure_azurite \
-p rattler_networking --test azure_azurite_fetch
162 changes: 162 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ google-cloud-auth = { version = "1", default-features = false, features = [
aws-config = { version = "1", default-features = false }
aws-sdk-s3 = { version = "1", default-features = false }
aws-smithy-http-client = { version = "1", default-features = false }
reqsign-core = "3.0.1"
reqsign-azure-storage = "3.0.1"
reqsign-command-execute-tokio = "3.0.1"
reqsign-file-read-tokio = "3.0.1"
reqsign-http-send-reqwest = "4.0.1"
aws-credential-types = { version = "1", default-features = false }
hashbrown = "0.17"
hex = "0.4"
Expand Down Expand Up @@ -148,6 +153,7 @@ rstest = { version = "0.26" }
rstest_reuse = "0.7"
rustix = { version = "1.1", default-features = false }
simd-json = { version = "0.17", features = ["serde_impl"] }
secrecy = "0.10"
self_cell = "1"
serde = { version = "1" }
serde_bytes = { version = "0.11" }
Expand Down Expand Up @@ -211,6 +217,7 @@ coalesced_map = { path = "crates/coalesced_map", version = "=0.1.4", default-fea
file_url = { path = "crates/file_url", version = "=0.3.2", default-features = false }
path_resolver = { path = "crates/path_resolver", version = "=0.2.12", default-features = false }
rattler = { path = "crates/rattler", version = "=0.48.0", default-features = false }
rattler_azure = { path = "crates/rattler_azure", version = "=0.1.0", default-features = false }
rattler_cache = { path = "crates/rattler_cache", version = "=0.10.4", default-features = false }
rattler_conda_types = { path = "crates/rattler_conda_types", version = "=0.49.0", default-features = false }
rattler_config = { path = "crates/rattler_config", version = "=0.6.2", default-features = false }
Expand Down
Loading