photoncloud-monorepo/docs/por/T042-creditservice/task.yaml
centra d2149b6249 fix(lightningstor): Fix SigV4 canonicalization for AWS S3 auth
- Replace form_urlencoded with RFC 3986 compliant URI encoding
- Implement aws_uri_encode() matching AWS SigV4 spec exactly
- Unreserved chars (A-Z,a-z,0-9,-,_,.,~) not encoded
- All other chars percent-encoded with uppercase hex
- Preserve slashes in paths, encode in query params
- Normalize empty paths to '/' per AWS spec
- Fix test expectations (body hash, HMAC values)
- Add comprehensive SigV4 signature determinism test

This fixes the canonicalization mismatch that caused signature
validation failures in T047. Auth can now be enabled for production.

Refs: T058.S1
2025-12-12 06:23:46 +09:00

165 lines
6.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

id: T042
name: CreditService - Credit/Quota Management
goal: Implement PROJECT.md Item 13 - project-based resource usage and billing management
status: complete
priority: P1
owner: peerA (spec), peerB (impl)
created: 2025-12-11
depends_on: []
blocks: []
context: |
**PROJECT.md Item 13: CreditService**
- プロジェクトごとのリソース使用量と課金を管理する「銀行」のようなサービス
- 各サービスPlasmaVMCなどからのリソース作成リクエストをインターセプトして残高確認Admission Control
- NightLightから使用量メトリクスを収集して定期的に残高を引き落とすBilling Batch
**Architecture Decision (2025-12-11):**
- IAMにクオータ管理を持たせず、専用のCreditServiceを新設
- NightLightを使用量計測のバックエンドとして活用
acceptance:
- Wallet/Balance management per project
- gRPC Admission Control API for resource creation checks
- NightLight integration for usage metrics
- Billing batch process for periodic deductions
- Multi-tenant isolation (project scoped)
steps:
- step: S1
name: Research and Specification
done: spec.md with API design, data model, integration points
status: complete
owner: peerA
priority: P0
outputs:
- path: specifications/creditservice/spec.md
note: Full specification (~400L)
notes: |
Completed:
- IAM Scope model analysis (ProjectScope with org_id)
- NightLight integration design (PromQL queries)
- 2-phase commit admission control pattern
- ChainFire/FlareDB storage options
Deliverables:
- specifications/creditservice/spec.md (complete)
- gRPC proto design (in spec)
- Data model: Wallet, Transaction, Reservation, Quota
- step: S2
name: Workspace Scaffold
done: creditservice workspace with types, proto, api, server crates
status: complete
owner: peerB
priority: P0
outputs:
- path: creditservice/crates/creditservice-types/
note: Core types (Wallet, Transaction, Reservation, Quota, Error)
- path: creditservice/crates/creditservice-proto/
note: gRPC proto generation
- path: creditservice/crates/creditservice-api/
note: Service implementation stubs
- path: creditservice/crates/creditservice-server/
note: Server binary
- path: creditservice/creditservice-client/
note: Client library
notes: |
**Complete (2025-12-11):**
- 5 crates created and building (cargo check OK)
- creditservice-types: ~400L (Wallet, Transaction, Reservation, Quota, Error)
- creditservice-proto: build.rs + proto generation
- creditservice-api: CreditServiceImpl with all method stubs
- creditservice-server: Server binary with health service
- creditservice-client: Client library with convenience methods
- step: S3
name: Core Wallet Management
done: Wallet CRUD, balance operations, transaction log
status: complete
owner: peerB
priority: P0
outputs:
- path: creditservice/crates/creditservice-api/src/storage.rs
note: CreditStorage trait + InMemoryStorage (~190L)
- path: creditservice/crates/creditservice-api/src/credit_service.rs
note: gRPC service with wallet methods (~450L)
notes: |
**Complete (2025-12-11):**
- CreditStorage trait abstraction for wallet/transaction/reservation/quota ops
- InMemoryStorage implementation with RwLock-based concurrency
- Implemented gRPC methods: get_wallet, create_wallet, top_up, get_transactions
- Proto-to-domain type conversions (Wallet, Transaction, WalletStatus)
- Error mapping (storage errors to gRPC Status codes)
- 7 unit tests passing (storage + service layer)
- step: S4
name: Admission Control API
done: gRPC service for resource creation checks
status: complete
owner: peerA
priority: P0
outputs:
- path: creditservice/crates/creditservice-api/src/credit_service.rs
note: Admission Control methods (~250L added)
notes: |
**Complete (2025-12-11) by PeerA:**
- check_quota: Balance + quota validation, returns allowed/denied with reason
- reserve_credits: 2-phase commit phase 1, creates reservation with TTL
- commit_reservation: Phase 2, deducts from wallet, logs transaction
- release_reservation: Releases held credits back to available balance
- set_quota/get_quota/list_quotas: Quota CRUD operations
- Proto conversion helpers for Quota, Reservation, ResourceType
- 7 new tests passing (total 14 tests for creditservice-api)
- step: S5
name: NightLight Integration
done: Usage metrics collection from NightLight
status: complete
owner: peerA
priority: P1
outputs:
- path: creditservice/crates/creditservice-api/src/nightlight.rs
note: NightLightClient (~420L)
notes: |
**Complete (2025-12-11) by PeerA:**
- NightLightClient implementing UsageMetricsProvider trait
- PromQL queries for all 10 ResourceTypes
- list_projects_with_usage() for batch billing discovery
- Health check endpoint
- 4 new tests passing
- step: S6
name: Billing Batch
done: Periodic billing process with configurable intervals
status: complete
owner: peerB
priority: P1
outputs:
- path: creditservice/crates/creditservice-api/src/billing.rs
note: Billing module (~200L)
- path: creditservice/crates/creditservice-api/src/credit_service.rs
note: process_billing method + process_project_billing helper
notes: |
**Complete (2025-12-11) by PeerB:**
- UsageMetricsProvider trait for metrics abstraction
- MockUsageMetricsProvider for testing
- PricingRules with default pricing per resource type
- process_billing gRPC method implementation
- Batch processing with per-project results
- Wallet suspension on zero/negative balance
- 3 new tests (21 total for creditservice-api)
evidence:
- cmd: "cargo test"
result: "21 tests passing (creditservice-api)"
notes: |
**T042 COMPLETE (2025-12-11)**
- Total: ~2,500L across 6 steps
- All acceptance criteria met:
- Wallet/Balance management per project ✓
- gRPC Admission Control API ✓
- NightLight integration ✓
- Billing batch process ✓
- Multi-tenant isolation (project scoped) ✓
- 21 tests in creditservice-api + 2 in creditservice-types = 23 tests total