From b02a281120fe9925eddd088553224254b50872c1 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Wed, 10 Jun 2026 17:00:55 +0000 Subject: [PATCH] =?UTF-8?q?test(provisioner):=20PIN=20failed-copy=20guard?= =?UTF-8?q?=20=E2=80=94=20assert=20VolumeRemove=20not=20called=20on=20migr?= =?UTF-8?q?ation=20error=20(#2490)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The migrateVolumeIfNeeded StatusCode guard already returns early when ContainerWait reports a non-zero exit, preserving the legacy volume. This adds an explicit assertion that VolumeRemove(legacyName) is NOT invoked in that path, locking the fix against regression. Refs #2490, KI-013 --- .../internal/provisioner/provisioner_migrate_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/workspace-server/internal/provisioner/provisioner_migrate_test.go b/workspace-server/internal/provisioner/provisioner_migrate_test.go index cb2423b88..af9405fe4 100644 --- a/workspace-server/internal/provisioner/provisioner_migrate_test.go +++ b/workspace-server/internal/provisioner/provisioner_migrate_test.go @@ -323,6 +323,14 @@ func TestMigrateVolumeIfNeeded_CopyFails_PreservesLegacy(t *testing.T) { if _, ok := cli.volumes[legacyName]; !ok { t.Fatal("legacy volume must be preserved when migration copy fails (data-loss guard)") } + + // VolumeRemove must NOT have been called — the guard is that we return + // before cleanup, leaving the legacy volume intact for retry. + for _, n := range cli.volumeRemoveCalls { + if n == legacyName { + t.Fatalf("VolumeRemove(%s) must NOT be called when copy fails — irreversible data-loss path", legacyName) + } + } } func TestStop_FullIDAbsent_LegacyRemoved(t *testing.T) { -- 2.52.0