github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/nomad/volumewatcher/volume_watcher_test.go (about)

     1  package volumewatcher
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/nomad/helper/testlog"
     8  	"github.com/hashicorp/nomad/nomad/mock"
     9  	"github.com/hashicorp/nomad/nomad/state"
    10  	"github.com/hashicorp/nomad/nomad/structs"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestVolumeWatch_Reap(t *testing.T) {
    15  	t.Parallel()
    16  	require := require.New(t)
    17  
    18  	srv := &MockRPCServer{
    19  		state: state.TestStateStore(t),
    20  	}
    21  
    22  	plugin := mock.CSIPlugin()
    23  	node := testNode(plugin, srv.State())
    24  	alloc := mock.Alloc()
    25  	alloc.NodeID = node.ID
    26  	alloc.ClientStatus = structs.AllocClientStatusComplete
    27  	vol := testVolume(plugin, alloc, node.ID)
    28  	vol.PastClaims = vol.ReadClaims
    29  
    30  	ctx, exitFn := context.WithCancel(context.Background())
    31  	w := &volumeWatcher{
    32  		v:      vol,
    33  		rpc:    srv,
    34  		state:  srv.State(),
    35  		ctx:    ctx,
    36  		exitFn: exitFn,
    37  		logger: testlog.HCLogger(t),
    38  	}
    39  
    40  	err := w.volumeReapImpl(vol)
    41  	require.NoError(err)
    42  
    43  	// past claim from a previous pass
    44  	vol.PastClaims = map[string]*structs.CSIVolumeClaim{
    45  		alloc.ID: {
    46  			NodeID: node.ID,
    47  			Mode:   structs.CSIVolumeClaimRead,
    48  			State:  structs.CSIVolumeClaimStateNodeDetached,
    49  		},
    50  	}
    51  	err = w.volumeReapImpl(vol)
    52  	require.NoError(err)
    53  	require.Len(vol.PastClaims, 1)
    54  
    55  	// claim emitted by a GC event
    56  	vol.PastClaims = map[string]*structs.CSIVolumeClaim{
    57  		"": {
    58  			NodeID: node.ID,
    59  			Mode:   structs.CSIVolumeClaimGC,
    60  		},
    61  	}
    62  	err = w.volumeReapImpl(vol)
    63  	require.NoError(err)
    64  	require.Len(vol.PastClaims, 2) // alloc claim + GC claim
    65  
    66  	// release claims of a previously GC'd allocation
    67  	vol.ReadAllocs[alloc.ID] = nil
    68  	vol.PastClaims = map[string]*structs.CSIVolumeClaim{
    69  		"": {
    70  			NodeID: node.ID,
    71  			Mode:   structs.CSIVolumeClaimRead,
    72  		},
    73  	}
    74  	err = w.volumeReapImpl(vol)
    75  	require.NoError(err)
    76  	require.Len(vol.PastClaims, 2) // alloc claim + GC claim
    77  }