github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/nomad/volumewatcher/volume_watcher_test.go (about) 1 package volumewatcher 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/hashicorp/nomad/ci" 8 "github.com/hashicorp/nomad/helper/testlog" 9 "github.com/hashicorp/nomad/nomad/mock" 10 "github.com/hashicorp/nomad/nomad/state" 11 "github.com/hashicorp/nomad/nomad/structs" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestVolumeWatch_Reap(t *testing.T) { 16 ci.Parallel(t) 17 require := require.New(t) 18 19 srv := &MockRPCServer{ 20 state: state.TestStateStore(t), 21 } 22 23 plugin := mock.CSIPlugin() 24 node := testNode(plugin, srv.State()) 25 alloc := mock.Alloc() 26 alloc.NodeID = node.ID 27 alloc.ClientStatus = structs.AllocClientStatusComplete 28 vol := testVolume(plugin, alloc, node.ID) 29 vol.PastClaims = vol.ReadClaims 30 31 ctx, exitFn := context.WithCancel(context.Background()) 32 w := &volumeWatcher{ 33 v: vol, 34 rpc: srv, 35 state: srv.State(), 36 ctx: ctx, 37 exitFn: exitFn, 38 logger: testlog.HCLogger(t), 39 } 40 41 vol, _ = srv.State().CSIVolumeDenormalize(nil, vol.Copy()) 42 err := w.volumeReapImpl(vol) 43 require.NoError(err) 44 45 // past claim from a previous pass 46 vol.PastClaims = map[string]*structs.CSIVolumeClaim{ 47 alloc.ID: { 48 NodeID: node.ID, 49 Mode: structs.CSIVolumeClaimRead, 50 State: structs.CSIVolumeClaimStateNodeDetached, 51 }, 52 } 53 vol, _ = srv.State().CSIVolumeDenormalize(nil, vol.Copy()) 54 err = w.volumeReapImpl(vol) 55 require.NoError(err) 56 require.Len(vol.PastClaims, 1) 57 58 // claim emitted by a GC event 59 vol.PastClaims = map[string]*structs.CSIVolumeClaim{ 60 "": { 61 NodeID: node.ID, 62 Mode: structs.CSIVolumeClaimGC, 63 }, 64 } 65 vol, _ = srv.State().CSIVolumeDenormalize(nil, vol.Copy()) 66 err = w.volumeReapImpl(vol) 67 require.NoError(err) 68 require.Len(vol.PastClaims, 2) // alloc claim + GC claim 69 70 // release claims of a previously GC'd allocation 71 vol.ReadAllocs[alloc.ID] = nil 72 vol.PastClaims = map[string]*structs.CSIVolumeClaim{ 73 "": { 74 NodeID: node.ID, 75 Mode: structs.CSIVolumeClaimRead, 76 }, 77 } 78 vol, _ = srv.State().CSIVolumeDenormalize(nil, vol.Copy()) 79 err = w.volumeReapImpl(vol) 80 require.NoError(err) 81 require.Len(vol.PastClaims, 2) // alloc claim + GC claim 82 } 83 84 func TestVolumeReapBadState(t *testing.T) { 85 ci.Parallel(t) 86 87 store := state.TestStateStore(t) 88 err := state.TestBadCSIState(t, store) 89 require.NoError(t, err) 90 srv := &MockRPCServer{ 91 state: store, 92 } 93 94 vol, err := srv.state.CSIVolumeByID(nil, 95 structs.DefaultNamespace, "csi-volume-nfs0") 96 require.NoError(t, err) 97 srv.state.CSIVolumeDenormalize(nil, vol) 98 99 ctx, exitFn := context.WithCancel(context.Background()) 100 w := &volumeWatcher{ 101 v: vol, 102 rpc: srv, 103 state: srv.State(), 104 ctx: ctx, 105 exitFn: exitFn, 106 logger: testlog.HCLogger(t), 107 } 108 109 err = w.volumeReapImpl(vol) 110 require.NoError(t, err) 111 require.Equal(t, 2, srv.countCSIUnpublish) 112 }