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.