github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/nomad/structs/volume_test.go (about) 1 package structs 2 3 import ( 4 "testing" 5 6 "github.com/hashicorp/nomad/ci" 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestVolumeRequest_Validate(t *testing.T) { 11 ci.Parallel(t) 12 13 testCases := []struct { 14 name string 15 expected []string 16 canariesCount int 17 taskGroupCount int 18 req *VolumeRequest 19 }{ 20 { 21 name: "host volume with empty source", 22 expected: []string{"volume has an empty source"}, 23 req: &VolumeRequest{ 24 Type: VolumeTypeHost, 25 }, 26 }, 27 { 28 name: "host volume with CSI volume config", 29 expected: []string{ 30 "host volumes cannot have an access mode", 31 "host volumes cannot have an attachment mode", 32 "host volumes cannot have mount options", 33 "host volumes do not support per_alloc", 34 }, 35 req: &VolumeRequest{ 36 Type: VolumeTypeHost, 37 ReadOnly: false, 38 AccessMode: CSIVolumeAccessModeSingleNodeReader, 39 AttachmentMode: CSIVolumeAttachmentModeBlockDevice, 40 MountOptions: &CSIMountOptions{ 41 FSType: "ext4", 42 MountFlags: []string{"ro"}, 43 }, 44 PerAlloc: true, 45 }, 46 }, 47 { 48 name: "CSI volume multi-reader-single-writer access mode", 49 expected: []string{ 50 "volume with multi-node-single-writer access mode allows only one writer", 51 }, 52 taskGroupCount: 2, 53 req: &VolumeRequest{ 54 Type: VolumeTypeCSI, 55 AccessMode: CSIVolumeAccessModeMultiNodeSingleWriter, 56 }, 57 }, 58 { 59 name: "CSI volume single reader access mode", 60 expected: []string{ 61 "volume with single-node-reader-only access mode allows only one reader", 62 }, 63 taskGroupCount: 2, 64 req: &VolumeRequest{ 65 Type: VolumeTypeCSI, 66 AccessMode: CSIVolumeAccessModeSingleNodeReader, 67 ReadOnly: true, 68 }, 69 }, 70 { 71 name: "CSI volume per-alloc with canaries", 72 expected: []string{"volume cannot be per_alloc when canaries are in use"}, 73 canariesCount: 1, 74 req: &VolumeRequest{ 75 Type: VolumeTypeCSI, 76 PerAlloc: true, 77 }, 78 }, 79 } 80 81 for _, tc := range testCases { 82 tc = tc 83 t.Run(tc.name, func(t *testing.T) { 84 err := tc.req.Validate(tc.taskGroupCount, tc.canariesCount) 85 for _, expected := range tc.expected { 86 require.Contains(t, err.Error(), expected) 87 } 88 }) 89 } 90 91 }