Once chain_moved records the kind, Assign, Unassign and Assigned write and read the keys <node>.<module>, and every join of the store that read assignments is made from the bucket: where a module runs, what is behind, what a machine awaits, a given value due for replacement, taking a module, and whether a module may be forgotten (refused while a standing assignment names it). An unassignment ends the key with a marker and keeps its earlier values, as it removed the row; no ended or pending mark is written yet. The generation rises with each change, and a seat held by an assignment goes with it: the foreign key from seat_holding is dropped by migration 0104 and the controller says both. The provisioner's plan is kept in the values by a pass of the tick that writes that one field by compare-and-set; the assignment-changed event is said from what the bucket holds, whoever wrote it. The start moves the rows with what each machine was last sent, keeping a plan the mirror put in a value.
46 lines
1.5 KiB
Go
46 lines
1.5 KiB
Go
package inventory
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// **The move of the chain has a switch, made by the last migration and written by no migration** (ADR 0408 §8, issue
|
|
// 1089): migration 0104 makes the one-row table chain_moved, and does not drop a table of the chain, which a later
|
|
// delivery does once the move is read back.
|
|
func TestMigration0104MakesTheSwitchOfTheChainsMoveAndNothingElse(t *testing.T) {
|
|
migrations, err := Migrations()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var found bool
|
|
for _, m := range migrations {
|
|
if m.Number != 104 {
|
|
continue
|
|
}
|
|
found = true
|
|
sql := strings.ToLower(m.SQL)
|
|
if !strings.Contains(sql, "create table chain_moved") || !strings.Contains(sql, "check (only_one)") {
|
|
t.Errorf("migration 0104 does not make the one-row chain_moved:\n%s", m.SQL)
|
|
}
|
|
for _, line := range strings.Split(sql, "\n") {
|
|
if strings.HasPrefix(strings.TrimSpace(line), "--") {
|
|
continue
|
|
}
|
|
for _, verb := range []string{"drop table", "insert ", "delete ", "update "} {
|
|
if strings.Contains(line, verb) {
|
|
t.Errorf("migration 0104 does more than make the switch: %q", line)
|
|
}
|
|
}
|
|
// The one other change: a seat's holder is no longer a foreign key to the assignment (issue 1093); the tables of
|
|
// the chain are dropped by a later migration (issue 1096).
|
|
if strings.Contains(line, "alter ") && !strings.Contains(line, "alter table seat_holding drop constraint") {
|
|
t.Errorf("migration 0104 alters more than the seat holdings' foreign key: %q", line)
|
|
}
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("no migration 0104")
|
|
}
|
|
}
|