Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
dd2e9f1
refactor(domain): move AllocationStrategy to aws provider
fgogolli Jun 15, 2026
97d4b7f
feat(orchestration): async timeout + to_thread guards
fgogolli Jun 15, 2026
922d4d6
refactor: remove dead method, fix DI bug, generic provider loader
fgogolli Jun 15, 2026
92375b9
refactor(auth): move iam/cognito to AWS registry
fgogolli Jun 15, 2026
fa6cf33
refactor(interface): remove hardcoded aws defaults
fgogolli Jun 15, 2026
c644455
refactor(cli): drive provider flags from spec registry
fgogolli Jun 15, 2026
6cfa0ba
feat(registry): default_api via ProviderRegistration
fgogolli Jun 15, 2026
500d77b
refactor(dto): typed provider_config field
fgogolli Jun 15, 2026
5640291
feat(scheduler): FieldMappingRegistry for HF provider hooks
fgogolli Jun 15, 2026
bbead3f
feat(domain): typed OperationOutcome union
fgogolli Jun 15, 2026
4e0a403
feat(registry): ProviderDefaultsLoaderRegistry
fgogolli Jun 15, 2026
e14d795
fix(return): write IN_PROGRESS on termination accept
fgogolli Jun 15, 2026
47bed1f
refactor: unconditional extension registry calls
fgogolli Jun 15, 2026
83cb9a9
docs: provider extension guide
fgogolli Jun 15, 2026
915674e
test: reorganise tests to mirror src/orb/providers/
fgogolli Jun 15, 2026
7166325
fix(domain): move FollowUpContext to domain layer
fgogolli Jun 15, 2026
729752c
fix(config): bootstrap defaults registry before iteration
fgogolli Jun 15, 2026
16c4172
chore: post-audit cleanup of leakage and stragglers
fgogolli Jun 15, 2026
6680ccf
test(integration): restore TemplateExtensionRegistry after clear_regi…
fgogolli Jun 15, 2026
c2f99d3
chore: replace OCI placeholder comments with doc reference
fgogolli Jun 15, 2026
fcc971c
fix(test): restore cfg_port in _inject_moto_factory handlers
fgogolli Jun 15, 2026
f55ec8f
chore: ruff lint + format pass; bump target-version to py310
fgogolli Jun 15, 2026
a658d77
ci(quality): split auto-format for fork PRs vs same-repo PRs
fgogolli Jun 15, 2026
8f87464
ci(quality): revert auto-format job to GITHUB_TOKEN identity
fgogolli Jun 15, 2026
75b49bc
ci: exclude k8s/ from shellcheck
fgogolli Jun 15, 2026
14d1d0e
ci(quality): drop App-install detail from suggester comment
fgogolli Jun 15, 2026
ba51977
refactor(auth): type auth sub-configs, factory classmethods
fgogolli Jun 15, 2026
d794add
fix(auth): harden four auth security issues
fgogolli Jun 15, 2026
9c06f5f
feat: surface AWS error details on failed requests
fgogolli Jun 15, 2026
6ced613
ci(quality): use pull_request_target so suggester can post reviews
fgogolli Jun 15, 2026
9ca0f23
ci(make): parallel pytest by default (PYTEST_WORKERS=auto)
fgogolli Jun 15, 2026
d1986ce
fix(test): correct repo_root path depth in live conftest
fgogolli Jun 15, 2026
68ca78d
fix(test): make TemplateProcessor path resolution robust
fgogolli Jun 15, 2026
c9dbdeb
fix(test): live conftest checks ~/.orb/config.json before repo fallback
fgogolli Jun 15, 2026
08348d8
fix(test): live conftest reuses ORB's own config-discovery
fgogolli Jun 15, 2026
6b48893
fix(test): export AWS_PROFILE/AWS_REGION from ORB config in live conf…
fgogolli Jun 15, 2026
82a1be6
fix(test): use canonical registration in delegate test
fgogolli Jun 15, 2026
acd1e76
refactor: consolidate provider registration
fgogolli Jun 15, 2026
c98e048
fix(test): point fixtures at config/ subdir
fgogolli Jun 15, 2026
af421b0
refactor: drop ProviderType enum, use str
fgogolli Jun 15, 2026
66c28ca
chore: ruff lint + format pass
fgogolli Jun 15, 2026
5751d59
feat(deps): move boto3 to [aws] optional extra
fgogolli Jun 15, 2026
a93a0aa
fix(deps): keep boto3 in core; [aws] extra is forward-compat alias
fgogolli Jun 15, 2026
c20adb7
fix(asg): guard release_instances against double capacity decrement
fgogolli Jun 15, 2026
3489526
fix(sdk): prevent ORB scheduler config dict from being absorbed as st…
fgogolli Jun 15, 2026
9691814
chore: ruff fixes, dedupe Unreleased section in changelog
fgogolli Jun 15, 2026
1ce6df9
fix: catch ImportError/ValueError from find_spec in provider bootstrap
fgogolli Jun 15, 2026
ac14811
fix(deps): upgrade cryptography to 49.0.0
fgogolli Jun 15, 2026
e7c4a7e
fix(asg): membership filter falls back to all on empty/uncertain resp…
fgogolli Jun 15, 2026
ad1cb69
fix(sdk): accept request_id (singular) as alias in get_request_status
fgogolli Jun 15, 2026
f8991b4
fix(asg): exclude Detaching/Detached instances from capacity decrement
fgogolli Jun 15, 2026
a8641a2
chore: ruff format
fgogolli Jun 15, 2026
c49b130
fix(test): assign ephemeral port per ORB server instance; capture stderr
fgogolli Jun 16, 2026
186d6d7
fix(status): guard COMPLETED against partial-fulfillment race for asy…
fgogolli Jun 16, 2026
c3c980f
feat(domain): add ProviderFulfilment contract value objects
fgogolli Jun 16, 2026
dd61690
feat(port): update check_hosts_status return type to CheckHostsStatus…
fgogolli Jun 16, 2026
8ef567b
feat(handler): RunInstances emits ProviderFulfilment from check_hosts…
fgogolli Jun 16, 2026
0ce3304
feat(handler): EC2Fleet emits ProviderFulfilment from check_hosts_status
fgogolli Jun 16, 2026
36111c2
feat(handler): SpotFleet emits ProviderFulfilment from check_hosts_st…
fgogolli Jun 16, 2026
305ac42
feat(handler): ASG emits ProviderFulfilment with weighted capacity sum
fgogolli Jun 16, 2026
cae6c4a
feat(strategy): plumb ProviderFulfilment through metadata; drop _augm…
fgogolli Jun 16, 2026
df42653
feat(app): request_status_service acquire path trusts ProviderFulfilm…
fgogolli Jun 16, 2026
e3503f9
feat(dto): surface capacity fields in RequestDTO from ProviderFulfilment
fgogolli Jun 16, 2026
15de2bb
test(app): rewrite request_status_service tests for fulfilment-only a…
fgogolli Jun 16, 2026
4557572
test(asg-handler): update unit tests for CheckHostsStatusResult contract
fgogolli Jun 16, 2026
052ec9b
test(spot-fleet-handler): update unit tests for CheckHostsStatusResul…
fgogolli Jun 16, 2026
6ca4175
test: update moto and unit tests for CheckHostsStatusResult contract
fgogolli Jun 16, 2026
0bef7b3
chore: ignore tests/providers/aws/live/run_templates/ artifacts
fgogolli Jun 16, 2026
8958d27
fix(mcp): bootstrap Application before constructing MCP server
fgogolli Jun 16, 2026
7c595cc
fix(test/rest): use scheduler-appropriate key for template lookup
fgogolli Jun 16, 2026
e04cb78
fix(test/sdk): poll return completion via get_request_status
fgogolli Jun 16, 2026
a1c1d85
fix(test/cleanup-e2e): relax instance-count assertion for weighted fl…
fgogolli Jun 16, 2026
57e9fa5
fix(app): read-through sync for ListReturnRequestsHandler
fgogolli Jun 16, 2026
fe98fed
fix(make): include [api] extra when running live AWS tests
fgogolli Jun 16, 2026
4d78de6
chore: ruff format provider handlers and fulfilment-contract tests
fgogolli Jun 16, 2026
57fd2d9
chore(test): use _msg for unused tuple element
fgogolli Jun 16, 2026
5aef5f2
fix(deps): bump lxml to >=6.1.0 (CVE-2026-41066)
fgogolli Jun 16, 2026
9863e18
ci(dependency-review): exempt verified-permissive compound-licensed p…
fgogolli Jun 16, 2026
0a1c7b1
fix(test/cleanup-e2e): poll return via get_request_status not list_re…
fgogolli Jun 17, 2026
2ab68e2
fix(test/mcp): relax instance-count assertion for weighted fleets
fgogolli Jun 17, 2026
148a3a8
fix(test/cleanup-e2e): bump fleet/ASG deletion wait to 300s
fgogolli Jun 17, 2026
44d376a
fix(test/rest): scheduler-aware request_id key in REST live tests
fgogolli Jun 17, 2026
7c4d323
test(live): helper for detecting weighted-capacity templates
fgogolli Jun 17, 2026
9c7b7cf
test(live): assert capacity-unit fulfilment + template-aware count
fgogolli Jun 17, 2026
e011f6e
fix(handler/ec2-fleet): set resource_id on instant fleet machine stubs
fgogolli Jun 17, 2026
6d3439a
fix(machine-sync): backfill missing resource_id from provider state
fgogolli Jun 17, 2026
e95afb5
fix(test/live): lazy-init boto3 clients to honour fixture-set AWS_PRO…
fgogolli Jun 17, 2026
b8870c4
fix(handler/asg): always fetch group details when group_ids known
fgogolli Jun 17, 2026
6fb15ac
fix(health): only register dynamodb health check when DynamoDB storag…
fgogolli Jun 17, 2026
20914eb
fix(dto): private_ip_address Optional[str]=None instead of ""
fgogolli Jun 17, 2026
eea896a
test(aws-monitoring): update for CheckHostsStatusResult contract
fgogolli Jun 17, 2026
925ff79
ci(trivy): ignore CVE-2026-54293 (nltk transitive, no upstream fix)
fgogolli Jun 17, 2026
779f351
feat(domain): cache last ProviderFulfilment on Request metadata
fgogolli Jun 17, 2026
8c4d4fa
feat(dto): factory + handlers plumb ProviderFulfilment into RequestDTO
fgogolli Jun 17, 2026
31ca6c0
fix(dto): serialize MachineDTO.tags as plain dict
fgogolli Jun 17, 2026
57dbd37
fix(scheduler/hf): surface ProviderFulfilment capacity fields in resp…
fgogolli Jun 17, 2026
45b34d0
fix(test/live): correctly detect weighted templates by resolving actu…
fgogolli Jun 17, 2026
b9de7bc
fix(test/live): lazy-init boto3 clients in sdk, mcp, and rest-api tes…
fgogolli Jun 17, 2026
f917375
fix(test/live): use ASG instance WeightedCapacity when asserting part…
fgogolli Jun 17, 2026
18b9cea
fix(live-tests): use profile-aware boto3 clients in multi-* terminati…
fgogolli Jun 17, 2026
c8469ff
fix(test/live+handlers): remove invalid EndTime from DescribeFleetHis…
fgogolli Jun 17, 2026
61f7583
fix(test/live): pass profile_name to boto3 in remaining test files
fgogolli Jun 18, 2026
e595e88
fix(test/live): bypass injected fake AWS credentials in cleanup-e2e a…
fgogolli Jun 18, 2026
92116b5
fix(cleanup): delete ASG and fleets correctly for weighted-capacity t…
fgogolli Jun 18, 2026
8a73ad6
refactor(handler/asg): use terminate_instance_in_auto_scaling_group f…
fgogolli Jun 18, 2026
6e11710
refactor(handler/fleet): release-by-weighted-capacity for EC2Fleet an…
fgogolli Jun 18, 2026
9237798
fix(strategy): offload check_hosts_status to thread pool
fgogolli Jun 18, 2026
7e600db
chore(templates): set maxNumber/max_instances=100 across all examples
fgogolli Jun 18, 2026
f7e2582
test: ruff format + minor live-test cleanup
fgogolli Jun 18, 2026
1a41634
ci(make): cap PYTEST_WORKERS at half the CPU count
fgogolli Jun 18, 2026
61d0f48
fix(test/multi-ec2-fleet): filter fleet count by test session to igno…
fgogolli Jun 18, 2026
e0fc17f
ci(make): drop duplicate container-health-check and test-docker recipes
fgogolli Jun 18, 2026
9a8b8d9
fix(test/rest): poll /requests/{id}/status and break on non-retryable…
fgogolli Jun 18, 2026
d29c19a
fix(cleanup): fix EC2Fleet cleanup_e2e for maintain, request, and ins…
fgogolli Jun 18, 2026
0f76707
fix(test/partial-return): use fleet WeightedCapacity for capacity dec…
fgogolli Jun 19, 2026
70d5170
fix(test/partial-return): lookup fleet weight via describe_instances …
fgogolli Jun 21, 2026
e77362e
fix(test/multi): apply AWS_PROFILE env-var fallback for boto3 sessions
fgogolli Jun 21, 2026
0a2e86a
fix(test/live): weight-lookup helpers log WARNING + propagate unexpec…
fgogolli Jun 21, 2026
ce5741c
fix(test/scenarios): narrow exception handling in _load_template_vm_t…
fgogolli Jun 21, 2026
2f3e7dd
test(scenarios): smoke test for _load_template_vm_types resolves real…
fgogolli Jun 21, 2026
fd125ce
fix(test/live): validate privateIpAddress and fix ASG weighted-capaci…
fgogolli Jun 21, 2026
c0bacef
test(live): assert running machines expose a private IP
fgogolli Jun 21, 2026
2dfa405
fix(test/rest): narrow HTTPError.response Optional check
fgogolli Jun 21, 2026
47e3623
refactor(strategy): use asyncio.to_thread instead of deprecated get_e…
fgogolli Jun 21, 2026
7d088be
fix(security): allowlist provider_type in dynamic module import
fgogolli Jun 21, 2026
d45e097
fix(auth/cognito): raise on non-2xx JWKS responses
fgogolli Jun 21, 2026
e579f68
refactor(application): extract _update_request_status helper
fgogolli Jun 21, 2026
b5d718c
fix(application): propagate ProviderContractError instead of swallowing
fgogolli Jun 21, 2026
2de6b93
refactor(handlers): extract shared fleet fulfilment helper
fgogolli Jun 21, 2026
89f40da
test(moto): re-export conftest helpers via __all__ to silence unused-…
fgogolli Jun 21, 2026
3828e6f
test(ec2-fleet): type _fleet_result state parameter as FulfilmentState
fgogolli Jun 21, 2026
43c00dd
test(aws-error): replace dict-unpack factory with typed ProvisioningR…
fgogolli Jun 21, 2026
16a9201
test(auth): add type: ignore[call-arg] on AuthConfig constructions wi…
fgogolli Jun 21, 2026
65880f8
test(mocks): cast typed service attributes to MagicMock before assert…
fgogolli Jun 21, 2026
1f60047
refactor(auth): rename token blacklist to denylist per inclusive lang…
fgogolli Jun 21, 2026
2a8b70b
test(telemetry): cast typed service attributes to MagicMock before as…
fgogolli Jun 21, 2026
b8c7e26
test(auth-subconfig): type: ignore[call-arg] on AuthConfig pydantic d…
fgogolli Jun 21, 2026
cc61687
refactor(arch): move CLISpecRegistry and TemplateExtensionRegistry to…
fgogolli Jun 21, 2026
0cdd190
refactor(application): rename aws_error_* DTO fields to provider_error_*
fgogolli Jun 21, 2026
47ec556
chore(tests/live): remove emoji glyphs from log strings
fgogolli Jun 22, 2026
ef9d957
refactor(handlers): remove dead fleet_type parameter from compute_cap…
fgogolli Jun 22, 2026
8eec305
refactor(commands): type _update_request_status helper params
fgogolli Jun 22, 2026
6456729
docs(providers): fix stale TemplateExtensionRegistry import path in R…
fgogolli Jun 22, 2026
217e4d6
refactor(application): inject TemplateExtensionRegistry via port to r…
fgogolli Jun 22, 2026
25c96d4
fix(test/rest): raise per-request HTTP timeout from 60s to 120s
fgogolli Jun 22, 2026
e96aa5c
test(handlers): direct unit tests for compute_capacity_based_fulfilme…
fgogolli Jun 22, 2026
9e3eff7
test(application): cover FAILED branch when zero instances and no res…
fgogolli Jun 22, 2026
52e4900
refactor(application): rename storage envelope key aws_error to provi…
fgogolli Jun 22, 2026
622cd6f
fix(auth/cognito): cache JWKS and offload fetch via asyncio.to_thread
fgogolli Jun 22, 2026
2ba37c3
chore(auth/iam): remove unused ASSUME_ALL_PERMISSIONS class attribute
fgogolli Jun 22, 2026
3792bd4
fix(test/live): skip partial-return capacity test when weighted scena…
fgogolli Jun 22, 2026
db88b2f
fix(deps): regenerate uv.lock to clear msgpack CVE GHSA-6v7p-g79w-8964
fgogolli Jun 22, 2026
5f90f71
fix(test): wrap handler construction in RequestDTOFactory patch
fgogolli Jun 22, 2026
dd4c390
fix(test/cleanup): mock _fleet_has_no_remaining_instances on partial-…
fgogolli Jun 22, 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
66 changes: 64 additions & 2 deletions .github/workflows/ci-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@ on:
- 'uv.lock'
- '.ruff.toml'
- '.github/workflows/ci-quality.yml'
# pull_request_target is needed only for the auto-format-suggest job to call
# the PR Reviews API on fork PRs. All other jobs gate on event_name to avoid
# double execution.
pull_request_target:
branches: [ main, develop ]
paths:
- 'src/**'
- 'tests/**'
- 'pyproject.toml'
- 'requirements*.txt'
- 'uv.lock'
- '.ruff.toml'
- '.github/workflows/ci-quality.yml'

permissions:
contents: read
Expand All @@ -32,6 +45,8 @@ jobs:

quality-check:
name: Quality Standards
# Skip on pull_request_target — only auto-format-suggest needs that event.
if: github.event_name != 'pull_request_target'
runs-on: ubuntu-latest
needs: config
permissions:
Expand Down Expand Up @@ -65,6 +80,8 @@ jobs:

setup-cache:
name: Setup Cache
# Runs on both pull_request and pull_request_target — auto-format-suggest
# depends on it and needs to run on pull_request_target for fork PRs.
needs: config
uses: ./.github/workflows/cache-management.yml
with:
Expand All @@ -73,8 +90,10 @@ jobs:
python-version: ${{ needs.config.outputs.default-python-version }}

auto-format:
name: Auto-Format Code
if: github.event_name == 'pull_request'
name: Auto-Format Code
# Same-repo PRs only: GITHUB_TOKEN can push directly to the branch.
# Fork PRs are handled by the auto-format-suggest job below.
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
needs: [config, setup-cache]
permissions:
Expand Down Expand Up @@ -108,8 +127,48 @@ jobs:
git push
fi

auto-format-suggest:
name: Auto-Format Suggestions
# Fork PRs: post formatted changes as PR review suggestions for the
# contributor to apply via the GitHub UI's "Commit suggestion" button.
# Uses pull_request_target so the GITHUB_TOKEN can call the PR Reviews API
# (POST /pulls/{id}/reviews) — pull_request fork-PR tokens cannot.
# The workflow file is evaluated at the base ref (safe); only the PR head
# code is checked out into a non-elevated working tree for formatting.
if: github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
runs-on: ubuntu-latest
needs: [config, setup-cache]
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout PR head
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
ref: ${{ github.event.pull_request.head.sha }}
# No token here — formatter does not need write access; this prevents
# untrusted PR code from authenticating with elevated permissions.
persist-credentials: false

- name: Setup UV with cache
uses: ./.github/actions/setup-uv-cached
with:
cache-key: ${{ needs.setup-cache.outputs.cache-key }}
fail-on-cache-miss: false

- name: Run formatter
run: make format-fix

- name: Post review suggestions
uses: reviewdog/action-suggester@aa38384ceb608d00f84b4690cacc83a5aba307ff # v1.24.0
with:
tool_name: ruff
level: warning
fail_on_error: false

lint-ruff:
name: Ruff (Code Quality)
if: github.event_name != 'pull_request_target'
runs-on: ubuntu-latest
needs: [config, setup-cache]
permissions:
Expand All @@ -129,6 +188,7 @@ jobs:

lint-ruff-optional:
name: Ruff (Extended Checks)
if: github.event_name != 'pull_request_target'
runs-on: ubuntu-latest
needs: [config, setup-cache, lint-ruff]
permissions:
Expand All @@ -149,6 +209,7 @@ jobs:

lint-pyright:
name: Type Checking (pyright)
if: github.event_name != 'pull_request_target'
runs-on: ubuntu-latest
needs: [config, setup-cache, lint-ruff]
permissions:
Expand All @@ -169,6 +230,7 @@ jobs:

arch-validation:
name: Architecture Validation
if: github.event_name != 'pull_request_target'
runs-on: ubuntu-latest
needs: [config, setup-cache, lint-ruff]
permissions:
Expand Down
17 changes: 11 additions & 6 deletions .github/workflows/security-code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,17 @@ jobs:
# in their PyPI METADATA. The compound string is treated as a single
# non-allowlisted license. Each exemption below has been verified by reading
# the package's METADATA license / License-Expression directly:
# werkzeug BSD-3-Clause AND LicenseRef-scancode-unknown-license-reference -> BSD-3-Clause
# lark MIT AND MPL-2.0 -> MIT (METADATA: License: MIT)
# mcp MIT AND Python-2.0 -> MIT (METADATA: License: MIT)
# rfc3987-syntax Apache-2.0 AND GPL-1.0-or-later AND MIT -> MIT (METADATA: License-Expression: MIT)
# wcwidth MIT AND HPND-Markus-Kuhn -> MIT (METADATA: License-Expression: MIT)
allow-dependencies-licenses: 'pkg:pypi/werkzeug, pkg:githubactions/trufflesecurity/trufflehog, pkg:pypi/lark, pkg:pypi/mcp, pkg:pypi/rfc3987-syntax, pkg:pypi/wcwidth'
# werkzeug BSD-3-Clause AND LicenseRef-scancode-unknown-license-reference -> BSD-3-Clause
# lark MIT AND MPL-2.0 -> MIT (METADATA: License: MIT)
# mcp MIT AND Python-2.0 -> MIT (METADATA: License: MIT)
# rfc3987-syntax Apache-2.0 AND GPL-1.0-or-later AND MIT -> MIT (METADATA: License-Expression: MIT)
# wcwidth MIT AND HPND-Markus-Kuhn -> MIT (METADATA: License-Expression: MIT)
# lxml BSD-3-Clause AND GPL-1.0-or-later -> BSD-3-Clause (METADATA: License: BSD-3-Clause; GPL applies to a single legacy source file)
# protobuf BSD-3-Clause AND LicenseRef-scancode-protobuf -> 3-Clause BSD (METADATA License text)
# pywin32 PSF-2.0 -> PSF-2.0 (permissive, equivalent to BSD)
# cyclonedx-python-lib no detected license -> Apache-2.0 (METADATA: License: Apache-2.0)
# fastapi no detected license -> MIT (METADATA: License-Expression: MIT)
allow-dependencies-licenses: 'pkg:pypi/werkzeug, pkg:githubactions/trufflesecurity/trufflehog, pkg:pypi/lark, pkg:pypi/mcp, pkg:pypi/rfc3987-syntax, pkg:pypi/wcwidth, pkg:pypi/lxml, pkg:pypi/protobuf, pkg:pypi/pywin32, pkg:pypi/cyclonedx-python-lib, pkg:pypi/fastapi'

codeql-analysis:
name: CodeQL Analysis
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/validate-workflows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,4 @@ jobs:
- name: Validate shell scripts with shellcheck
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
with:
ignore_paths: '.venv .git __pycache__ node_modules'
ignore_paths: '.venv .git __pycache__ node_modules k8s'
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ requirements-dev.txt
work/

# Test autogenerated files
tests/onaws/run_templates*
tests/providers/aws/live/run_templates/
tests/providers/aws/live/run_templates/**

# Desloppify scan artifacts
.desloppify/
Expand Down
6 changes: 6 additions & 0 deletions .trivyignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ __pycache__/**
htmlcov/**
.tox/**
.mypy_cache/**

# CVE exceptions for transitive CI/dev-only dependencies with no upstream patch
# nltk 3.9.4 — CVE-2026-54293 (HIGH). Pulled in transitively by `safety` (CI-only
# security scanner). No fixed version available upstream as of 2026-06-17. Not
# present in runtime install. Re-evaluate when nltk publishes a patched release.
CVE-2026-54293
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,36 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
<!-- insertion marker -->
## Unreleased

### Added

- New `[aws]` extra (alias for AWS deps currently in core). The canonical install
command going forward is `pip install orb-py[aws]`. This continues to work
unchanged when AWS deps move out of core in a future major version.
- New `[all-providers]` meta-extra: pulls in all currently implemented providers.
- New `[monitoring-aws]` extra: AWS-specific OpenTelemetry boto instrumentation (previously bundled inside `[monitoring]`).
- New `[test-aws]` extra: moto + response-mocking deps for AWS test suites.
- Architecture test `test_boto3_leak_detection.py`: asserts boto3/botocore are never imported outside `providers/aws/` except by guarded backward-compat shims.
- Unit tests `test_no_provider_install.py`: verifies ORB core modules boot cleanly when AWS deps are absent.

### Changed

- `[monitoring]` extra no longer includes `opentelemetry-instrumentation-boto` (use `[monitoring-aws]`).
- `[all]` extra now includes `[all-providers]` so `pip install orb-py[all]` still pulls everything.
- `[dev]` shim extra now includes `[all-providers]` for full local development.
- Three module-level import sites guarded with `try/except ImportError` so ORB core boots when AWS extras are absent:
`config/schemas/cleanup_schema.py`, `infrastructure/storage/registration.py`,
`providers/registration.py` (deprecated shims).
- `tests/conftest.py`: bare `import boto3` replaced with guarded `AWS_AVAILABLE` flag; AWS provider tests auto-skip when `[aws]` extra is absent.

### Notes

- `boto3` + `botocore` **remain in core** `[project.dependencies]` for now to
preserve backward compatibility — `pip install orb-py` still works unchanged.
- When the second provider (Azure / GCP / OCI) lands, AWS deps will move from
core to the `[aws]` extra and a major-version bump will signal the breaking
change. Operators who use `pip install orb-py[aws]` today will see no
behavior change at that cutover.

<small>[Compare with latest](https://github.com/awslabs/open-resource-broker/compare/v0.1.0rc0...HEAD)</small>

### Features
Expand Down
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,36 @@ Get ORB installed and configured for your environment.
<details>
<summary>Installation</summary>

### Standard install
### Standard install (core only — no provider)

```bash
pip install orb-py
```

ORB boots cleanly with no provider registered. Any command that needs a provider
will return a clear "no provider configured" error rather than an ImportError.

### Per-provider install

```bash
pip install "orb-py[aws]" # AWS provider (boto3 + botocore)
pip install "orb-py[aws,cli]" # AWS provider + colored CLI output
pip install "orb-py[aws,api]" # AWS provider + REST API server
pip install "orb-py[monitoring-aws]" # AWS provider + full monitoring stack
pip install "orb-py[all]" # All providers + all features
```

### Provider extras matrix

| Use case | Install command |
|----------|----------------|
| Core only (no provider) | `pip install orb-py` |
| AWS operator | `pip install "orb-py[aws]"` |
| AWS + colored CLI | `pip install "orb-py[aws,cli]"` |
| AWS + REST API | `pip install "orb-py[aws,api]"` |
| AWS + monitoring | `pip install "orb-py[monitoring-aws]"` |
| Full (all providers + features) | `pip install "orb-py[all]"` |

### With colored CLI output

```bash
Expand Down
Loading
Loading