From e732e7aaf3374f5b64355e289d1817bb273c9462 Mon Sep 17 00:00:00 2001 From: dawn Date: Thu, 27 Aug 2026 22:50:25 +0900 Subject: [PATCH] spindle/db: add migration for backfilling missing repo_did's for mill artifacts table Signed-off-by: dawn --- spindle/db/artifacts_test.go | 75 ++++++++++++++++++++++++++++++++++++ spindle/db/db.go | 28 ++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 spindle/db/artifacts_test.go diff --git a/spindle/db/artifacts_test.go b/spindle/db/artifacts_test.go new file mode 100644 index 000000000..73e6b2ecb --- /dev/null +++ b/spindle/db/artifacts_test.go @@ -0,0 +1,75 @@ +package db + +import ( + "context" + "database/sql" + "path/filepath" + "testing" +) + +func TestMakeMigratesLegacyMillArtifactsRepoDID(t *testing.T) { + path := filepath.Join(t.TempDir(), "spindle.db") + legacy, err := sql.Open("sqlite3", path) + if err != nil { + t.Fatalf("open legacy database: %v", err) + } + if _, err := legacy.Exec(` + create table mill_artifacts ( + id integer primary key autoincrement, + lease_id text not null, + workflow text not null, + ref text not null, + hash text not null + ); + create table mill_leases ( + lease_id text primary key, + node_id text not null, + epoch text not null, + engine text not null, + knot text not null, + rkey text not null, + workflow text not null, + state text not null, + repo_did text + ); + insert into mill_leases ( + lease_id, node_id, epoch, engine, knot, rkey, workflow, state, repo_did + ) values ( + 'legacy-lease', 'node', 'epoch', 'engine', 'knot', 'rkey', + 'legacy-workflow', 'done', 'did:plc:legacy-repo' + ); + insert into mill_artifacts (lease_id, workflow, ref, hash) + values ('legacy-lease', 'legacy-workflow', 'legacy-ref', 'legacy-hash'); + `); err != nil { + legacy.Close() + t.Fatalf("seed legacy database: %v", err) + } + if err := legacy.Close(); err != nil { + t.Fatalf("close legacy database: %v", err) + } + + d, err := Make(context.Background(), path) + if err != nil { + t.Fatalf("Make: %v", err) + } + t.Cleanup(func() { d.Close() }) + + var legacyRepoDID string + if err := d.QueryRow(`select repo_did from mill_artifacts where lease_id = 'legacy-lease'`).Scan(&legacyRepoDID); err != nil { + t.Fatalf("query migrated artifact: %v", err) + } + if legacyRepoDID != "did:plc:legacy-repo" { + t.Fatalf("legacy repo_did = %q, want did:plc:legacy-repo", legacyRepoDID) + } + + if err := d.SaveArtifactRef("new-lease", "did:plc:repo", "build", "new-ref", "new-hash"); err != nil { + t.Fatalf("SaveArtifactRef: %v", err) + } + var repoDID string + if err := d.QueryRow(`select repo_did from mill_artifacts where lease_id = 'new-lease'`).Scan(&repoDID); err != nil { + t.Fatalf("query new artifact: %v", err) + } + if repoDID != "did:plc:repo" { + t.Fatalf("new repo_did = %q, want did:plc:repo", repoDID) + } +} diff --git a/spindle/db/db.go b/spindle/db/db.go index cdd502110..82b09950a 100644 --- a/spindle/db/db.go +++ b/spindle/db/db.go @@ -586,6 +586,34 @@ func runMigrations(_ context.Context, conn *sql.Conn, logger *slog.Logger) error return err } + if err := orm.RunMigration(conn, logger, "mill-artifacts-repo-did", func(tx *sql.Tx) error { + var present int + if err := tx.QueryRow( + `select count(*) from pragma_table_info('mill_artifacts') where name = 'repo_did'`, + ).Scan(&present); err != nil { + return err + } + if present == 0 { + if _, err := tx.Exec( + `alter table mill_artifacts add column repo_did text not null default ''`, + ); err != nil { + return err + } + } + + _, err := tx.Exec(` + update mill_artifacts + set repo_did = coalesce(( + select repo_did from mill_leases + where mill_leases.lease_id = mill_artifacts.lease_id + ), repo_did, '') + where coalesce(repo_did, '') = ''; + `) + return err + }); err != nil { + return err + } + if err := orm.RunMigration(conn, logger, "bans-schema", func(tx *sql.Tx) error { _, err := tx.Exec(` create table if not exists bans ( -- 2.51.2