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  }