Очередь job получила lease и fencing, телеметрия и прогресс deploy сохраняются, ревизия пишет manifest входов. Обновление префиксов не переписывает неизменённый снимок, большие наборы идут через COPY, а устаревшая ревизия не попадает в deploy. Бандл ноды кэшируется, prune и постановка job больше не держат горячий путь. Co-authored-by: Cursor <cursoragent@cursor.com>
51 lines
1.0 KiB
Go
51 lines
1.0 KiB
Go
package repository
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
type partialSnapshotRows struct {
|
|
returned bool
|
|
scanErr error
|
|
rowsErr error
|
|
}
|
|
|
|
func (r *partialSnapshotRows) Next() bool {
|
|
if r.returned {
|
|
return false
|
|
}
|
|
r.returned = true
|
|
return true
|
|
}
|
|
|
|
func (r *partialSnapshotRows) Scan(dest ...any) error {
|
|
if r.scanErr != nil {
|
|
return r.scanErr
|
|
}
|
|
*dest[0].(*string) = "192.0.2.0/24"
|
|
*dest[1].(**string) = nil
|
|
*dest[2].(*string) = "cdn:test"
|
|
return nil
|
|
}
|
|
|
|
func (r *partialSnapshotRows) Err() error { return r.rowsErr }
|
|
|
|
func TestReadModuleSnapshotRowsRejectsPartialResults(t *testing.T) {
|
|
sentinel := errors.New("simulated read failure")
|
|
for _, tc := range []struct {
|
|
name string
|
|
rows *partialSnapshotRows
|
|
}{
|
|
{"scan", &partialSnapshotRows{scanErr: sentinel}},
|
|
{"iteration", &partialSnapshotRows{rowsErr: sentinel}},
|
|
} {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
prefixes, err := readModuleSnapshotRows(tc.rows)
|
|
if prefixes != nil || !errors.Is(err, sentinel) {
|
|
t.Fatalf("partial snapshot returned: %+v %v", prefixes, err)
|
|
}
|
|
})
|
|
}
|
|
}
|