Files
seaweedfs/weed/storage/blockvol/testrunner/protocol.go
T
Ping QiuandClaude Opus 4.6 da1b81d1c9 feat: CP8-3-1 durability modes + testrunner platform + 21 adversarial tests
Durability mode implementation (sync_all, sync_quorum, best_effort):
- DurabilityMode type with superblock persistence, parse/validate/string
- MakeDistributedSync mode-aware barrier enforcement in dist_group_commit
- blockerr sentinel package (ErrDurabilityBarrierFailed, ErrDurabilityQuorumLost)
- gRPC create path: mode validation, idempotent create consistency, partial cleanup
- F1: strict mode rejects partial replica provisioning with cleanup
- F3: empty heartbeat does not overwrite persisted strict mode
- F4: SCSI error mapping uses errors.Is sentinels (not string matching)
- Proto/wire/blockapi/CLI/UI plumbing for durability_mode field
- Observability dashboard: cluster health cards + per-volume columns

Testrunner platform (YAML-driven integration test framework):
- Engine, parser, registry, reporter (JUnit XML + HTML), metrics scraping
- 52 registered actions: block, iSCSI, I/O, fault injection, assertions
- Baseline regression framework with 7 hard-fail conditions
- 15 YAML scenarios (smoke, crash, HA, fault, consistency, snapshot)
- 49 unit tests for testrunner internals

QA adversarial suite (21 tests, all PASS):
- Idempotent create mode/RF mismatch detection
- Heartbeat mode downgrade prevention (F3)
- sync_all/sync_quorum partial replica enforcement (F1)
- Concurrent create race safety
- Failover/expand mode preservation
- Cleanup resilience when delete fails
- Master restart auto-register mode handling
- Superblock roundtrip all 3 modes
- Validate edge cases (mode×RF matrix)
- RequiredReplicas quorum math verification
- Sentinel error categorization

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:06:51 -08:00

74 lines
2.4 KiB
Go

package testrunner
// AuthTokenHeader is the HTTP header used for coordinator↔agent authentication.
const AuthTokenHeader = "X-Auth-Token"
// UploadBasePath is the required prefix for all upload paths.
const UploadBasePath = "/tmp/sw-test-runner/"
// RegisterRequest is sent by an agent to the coordinator at POST /register.
type RegisterRequest struct {
AgentID string `json:"agent_id"`
Hostname string `json:"hostname"`
IP string `json:"ip"`
Port int `json:"port"`
Nodes []string `json:"nodes"`
Capabilities []string `json:"capabilities"`
}
// RegisterResponse is returned by the coordinator after successful registration.
type RegisterResponse struct {
OK bool `json:"ok"`
AgentIndex int `json:"agent_index"`
TotalAgents int `json:"total_agents"`
Error string `json:"error,omitempty"`
}
// PhaseRequest is sent by the coordinator to an agent at POST /phase.
type PhaseRequest struct {
PhaseIndex int `json:"phase_index"`
PhaseName string `json:"phase_name"`
Actions []Action `json:"actions"`
GlobalVars map[string]string `json:"global_vars"`
Scenario *Scenario `json:"scenario,omitempty"`
}
// PhaseResponse is returned by the agent after executing a phase.
type PhaseResponse struct {
PhaseIndex int `json:"phase_index"`
Results []ActionResult `json:"results"`
NewVars map[string]string `json:"new_vars"`
Error string `json:"error,omitempty"`
}
// ExecRequest is sent by the coordinator to an agent at POST /exec.
type ExecRequest struct {
Cmd string `json:"cmd"`
Root bool `json:"root"`
}
// ExecResponse is returned by the agent after executing a command.
type ExecResponse struct {
Stdout string `json:"stdout"`
Stderr string `json:"stderr"`
ExitCode int `json:"exit_code"`
Error string `json:"error,omitempty"`
}
// UploadResponse is returned by the agent after receiving a file upload.
type UploadResponse struct {
OK bool `json:"ok"`
Size int64 `json:"size"`
Path string `json:"path"`
Error string `json:"error,omitempty"`
}
// HealthResponse is returned by the agent at GET /health.
type HealthResponse struct {
OK bool `json:"ok"`
AgentID string `json:"agent_id"`
UptimeS int64 `json:"uptime_s"`
HasRoot bool `json:"has_root"`
Hostname string `json:"hostname"`
}