- Created T026-practical-test task.yaml for MVP smoke testing - Added k8shost-server to flake.nix (packages, apps, overlays) - Staged all workspace directories for nix flake build - Updated flake.nix shellHook to include k8shost Resolves: T026.S1 blocker (R8 - nix submodule visibility)
133 lines
4.9 KiB
YAML
133 lines
4.9 KiB
YAML
id: T017
|
||
name: FlashDNS DNS Service Deepening
|
||
status: complete
|
||
goal: Implement functional DNS service with zone/record management and DNS query resolution
|
||
priority: P1
|
||
owner: peerA (strategy) + peerB (implementation)
|
||
created: 2025-12-08
|
||
depends_on: [T016]
|
||
|
||
context: |
|
||
PROJECT.md item 6 specifies FlashDNS:
|
||
"DNS(FlashDNS)
|
||
- PowerDNSを完全に代替可能なようにしてほしい。
|
||
- Route53のようなサービスが作れるようにしたい。
|
||
- BINDも使いたくない。
|
||
- DNS All-Rounderという感じにしたい。"
|
||
|
||
T009 created scaffold with spec (1043L). Current state:
|
||
- Workspace structure exists (flashdns-api, flashdns-server, flashdns-types)
|
||
- ZoneService/RecordService gRPC scaffolds (all unimplemented)
|
||
- DnsHandler scaffold (returns NOTIMP for all queries)
|
||
- 6 tests pass (basic structure)
|
||
|
||
Need functional implementation for:
|
||
- Zone CRUD via gRPC
|
||
- Record CRUD via gRPC
|
||
- DNS query resolution (UDP port 53)
|
||
- ChainFire metadata persistence
|
||
- In-memory zone cache
|
||
|
||
acceptance:
|
||
- gRPC ZoneService functional (CreateZone, GetZone, ListZones, DeleteZone)
|
||
- gRPC RecordService functional (CreateRecord, GetRecord, ListRecords, DeleteRecord)
|
||
- DNS handler resolves A/AAAA/CNAME/MX/TXT queries for managed zones
|
||
- Zones/records persisted to ChainFire
|
||
- Integration test proves zone creation + DNS query resolution
|
||
|
||
steps:
|
||
- step: S1
|
||
action: Metadata store for zones and records
|
||
priority: P0
|
||
status: complete
|
||
owner: peerB
|
||
completed: 2025-12-08
|
||
notes: |
|
||
Create DnsMetadataStore (similar to LightningSTOR MetadataStore).
|
||
ChainFire-backed storage for zones and records.
|
||
Key schema: /flashdns/zones/{org}/{project}/{zone_name}
|
||
/flashdns/records/{zone_id}/{record_name}/{record_type}
|
||
deliverables:
|
||
- DnsMetadataStore with zone CRUD
|
||
- DnsMetadataStore with record CRUD
|
||
- Unit tests
|
||
evidence:
|
||
- flashdns/crates/flashdns-server/src/metadata.rs: 439L with full CRUD
|
||
- Zone: save/load/load_by_id/list/delete
|
||
- Record: save/load/load_by_id/list/list_by_name/delete
|
||
- ChainFire + InMemory backend support
|
||
- 2 unit tests passing (test_zone_crud, test_record_crud)
|
||
|
||
- step: S2
|
||
action: Implement gRPC zone and record services
|
||
priority: P0
|
||
status: complete
|
||
owner: peerB
|
||
completed: 2025-12-08
|
||
notes: |
|
||
Wire ZoneService + RecordService to DnsMetadataStore.
|
||
Implement: CreateZone, GetZone, ListZones, UpdateZone, DeleteZone
|
||
Implement: CreateRecord, GetRecord, ListRecords, UpdateRecord, DeleteRecord
|
||
deliverables:
|
||
- Functional gRPC ZoneService
|
||
- Functional gRPC RecordService
|
||
evidence:
|
||
- zone_service.rs: 376L, all 7 methods (create/get/list/update/delete/enable/disable)
|
||
- record_service.rs: 480L, all 7 methods (create/get/list/update/delete/batch_create/batch_delete)
|
||
- main.rs: updated with optional ChainFire endpoint
|
||
- cargo check + cargo test pass
|
||
|
||
- step: S3
|
||
action: Implement DNS query resolution
|
||
priority: P1
|
||
status: complete
|
||
owner: peerB
|
||
completed: 2025-12-08
|
||
notes: |
|
||
Extend DnsHandler to actually resolve queries.
|
||
Use trust-dns-proto for wire format parsing/building.
|
||
Load zones from DnsMetadataStore or in-memory cache.
|
||
Support: A, AAAA, CNAME, MX, TXT, NS, SOA queries.
|
||
deliverables:
|
||
- DnsHandler resolves queries
|
||
- Zone cache for fast lookups
|
||
evidence:
|
||
- handler.rs: 456L, DnsHandler with DnsMetadataStore
|
||
- DnsQueryHandler: parse query, find zone (suffix match), lookup records, build response
|
||
- Record type conversion: A, AAAA, CNAME, MX, TXT, NS, SRV, PTR, CAA
|
||
- Response codes: NoError, NXDomain, Refused, NotImp, ServFail
|
||
- main.rs: wires metadata to DnsHandler
|
||
- cargo check + cargo test: 3 tests passing
|
||
|
||
- step: S4
|
||
action: Integration test
|
||
priority: P1
|
||
status: complete
|
||
owner: peerB
|
||
completed: 2025-12-08
|
||
notes: |
|
||
End-to-end test: create zone via gRPC, add A record, query via DNS.
|
||
Verify ChainFire persistence and cache behavior.
|
||
deliverables:
|
||
- Integration tests passing
|
||
- Evidence log
|
||
evidence:
|
||
- tests/integration.rs: 280L with 4 tests
|
||
- test_zone_and_record_lifecycle: CRUD lifecycle with multiple record types
|
||
- test_multi_zone_scenario: multi-org/project zones
|
||
- test_record_type_coverage: all 9 record types (A, AAAA, CNAME, MX, TXT, NS, SRV, PTR, CAA)
|
||
- test_dns_query_resolution_docs: manual testing guide
|
||
- cargo test -p flashdns-server --test integration -- --ignored: 4/4 pass
|
||
|
||
blockers: []
|
||
|
||
evidence: []
|
||
|
||
notes: |
|
||
FlashDNS enables:
|
||
- Custom DNS zones for VM/container workloads
|
||
- Route53-like DNS-as-a-service functionality
|
||
- Internal service discovery
|
||
|
||
Risk: DNS protocol complexity (many edge cases).
|
||
Mitigation: Use trust-dns-proto for wire format, focus on common record types.
|