photoncloud-monorepo/docs/por/T017-flashdns-deepening/task.yaml
centra a7ec7e2158 Add T026 practical test + k8shost to flake + workspace files
- 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)
2025-12-09 06:07:50 +09:00

133 lines
4.9 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: 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:
"DNSFlashDNS
- 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.