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  }