99 "time"
1010
1111 "github.com/cosi-project/runtime/pkg/resource"
12+ "github.com/siderolabs/gen/xslices"
1213 "github.com/siderolabs/go-pointer"
1314 "github.com/stretchr/testify/assert"
1415 "github.com/stretchr/testify/suite"
@@ -40,18 +41,26 @@ func TestUserVolumeConfigSuite(t *testing.T) {
4041}
4142
4243func (suite * UserVolumeConfigSuite ) TestReconcileUserVolumesSwapVolumes () {
43- uv1 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
44- uv1 .MetaName = "data1"
45- suite .Require ().NoError (uv1 .ProvisioningSpec .DiskSelectorSpec .Match .UnmarshalText ([]byte (`system_disk` )))
46- uv1 .ProvisioningSpec .ProvisioningMinSize = blockcfg .MustByteSize ("10GiB" )
47- uv1 .ProvisioningSpec .ProvisioningMaxSize = blockcfg .MustByteSize ("100GiB" )
48- uv1 .FilesystemSpec .FilesystemType = block .FilesystemTypeXFS
49-
50- uv2 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
51- uv2 .MetaName = "data2"
52- suite .Require ().NoError (uv2 .ProvisioningSpec .DiskSelectorSpec .Match .UnmarshalText ([]byte (`!system_disk` )))
53- uv2 .ProvisioningSpec .ProvisioningMaxSize = blockcfg .MustByteSize ("1TiB" )
54- uv2 .EncryptionSpec = blockcfg.EncryptionSpec {
44+ userVolumeNames := []string {
45+ "data-part1" ,
46+ "data-part2" ,
47+ "data-dir1" ,
48+ "data-disk1" ,
49+ }
50+
51+ uvPart1 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
52+ uvPart1 .MetaName = userVolumeNames [0 ]
53+ suite .Require ().NoError (uvPart1 .ProvisioningSpec .DiskSelectorSpec .Match .UnmarshalText ([]byte (`system_disk` )))
54+ uvPart1 .ProvisioningSpec .ProvisioningMinSize = blockcfg .MustByteSize ("10GiB" )
55+ uvPart1 .ProvisioningSpec .ProvisioningMaxSize = blockcfg .MustByteSize ("100GiB" )
56+ uvPart1 .FilesystemSpec .FilesystemType = block .FilesystemTypeXFS
57+
58+ uvPart2 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
59+ uvPart2 .MetaName = userVolumeNames [1 ]
60+ uvPart2 .VolumeType = pointer .To (block .VolumeTypePartition )
61+ suite .Require ().NoError (uvPart2 .ProvisioningSpec .DiskSelectorSpec .Match .UnmarshalText ([]byte (`!system_disk` )))
62+ uvPart2 .ProvisioningSpec .ProvisioningMaxSize = blockcfg .MustByteSize ("1TiB" )
63+ uvPart2 .EncryptionSpec = blockcfg.EncryptionSpec {
5564 EncryptionProvider : block .EncryptionProviderLUKS2 ,
5665 EncryptionKeys : []blockcfg.EncryptionKey {
5766 {
@@ -65,32 +74,45 @@ func (suite *UserVolumeConfigSuite) TestReconcileUserVolumesSwapVolumes() {
6574 },
6675 }
6776
68- uv3 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
69- uv3 .MetaName = "data3"
70- uv3 .VolumeType = pointer .To (block .VolumeTypeDirectory )
77+ uvDir1 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
78+ uvDir1 .MetaName = userVolumeNames [2 ]
79+ uvDir1 .VolumeType = pointer .To (block .VolumeTypeDirectory )
80+
81+ uvDisk1 := blockcfg .NewUserVolumeConfigV1Alpha1 ()
82+ uvDisk1 .MetaName = userVolumeNames [3 ]
83+ suite .Require ().NoError (uvDisk1 .ProvisioningSpec .DiskSelectorSpec .Match .UnmarshalText ([]byte (`!system_disk` )))
84+ uvDisk1 .EncryptionSpec = blockcfg.EncryptionSpec {
85+ EncryptionProvider : block .EncryptionProviderLUKS2 ,
86+ EncryptionKeys : []blockcfg.EncryptionKey {
87+ {
88+ KeySlot : 0 ,
89+ KeyTPM : & blockcfg.EncryptionKeyTPM {},
90+ },
91+ {
92+ KeySlot : 1 ,
93+ KeyStatic : & blockcfg.EncryptionKeyStatic {KeyData : "secret" },
94+ },
95+ },
96+ }
7197
7298 sv1 := blockcfg .NewSwapVolumeConfigV1Alpha1 ()
7399 sv1 .MetaName = "swap"
74100 suite .Require ().NoError (sv1 .ProvisioningSpec .DiskSelectorSpec .Match .UnmarshalText ([]byte (`disk.transport == "nvme"` )))
75101 sv1 .ProvisioningSpec .ProvisioningMaxSize = blockcfg .MustByteSize ("2GiB" )
76102
77- ctr , err := container .New (uv1 , uv2 , uv3 , sv1 )
103+ ctr , err := container .New (uvPart1 , uvPart2 , uvDir1 , uvDisk1 , sv1 )
78104 suite .Require ().NoError (err )
79105
80106 cfg := config .NewMachineConfig (ctr )
81107 suite .Create (cfg )
82108
83- userVolumes := []string {
84- constants .UserVolumePrefix + "data1" ,
85- constants .UserVolumePrefix + "data2" ,
86- constants .UserVolumePrefix + "data3" ,
87- }
109+ userVolumes := xslices .Map (userVolumeNames , func (in string ) string { return constants .UserVolumePrefix + in })
88110
89111 ctest .AssertResources (suite , userVolumes , func (vc * block.VolumeConfig , asrt * assert.Assertions ) {
90112 asrt .Contains (vc .Metadata ().Labels ().Raw (), block .UserVolumeLabel )
91113
92114 switch vc .Metadata ().ID () {
93- case userVolumes [0 ], userVolumes [1 ]:
115+ case userVolumes [0 ], userVolumes [1 ], userVolumes [ 3 ] :
94116 asrt .Equal (block .VolumeTypePartition , vc .TypedSpec ().Type )
95117
96118 asrt .Contains (userVolumes , vc .TypedSpec ().Provisioning .PartitionSpec .Label )
@@ -104,7 +126,7 @@ func (suite *UserVolumeConfigSuite) TestReconcileUserVolumesSwapVolumes() {
104126 asrt .Equal (block .VolumeTypeDirectory , vc .TypedSpec ().Type )
105127 }
106128
107- asrt .Contains ([] string { "data1" , "data2" , "data3" } , vc .TypedSpec ().Mount .TargetPath )
129+ asrt .Contains (userVolumeNames , vc .TypedSpec ().Mount .TargetPath )
108130 asrt .Equal (constants .UserVolumeMountPoint , vc .TypedSpec ().Mount .ParentID )
109131
110132 switch vc .Metadata ().ID () {
@@ -143,8 +165,8 @@ func (suite *UserVolumeConfigSuite) TestReconcileUserVolumesSwapVolumes() {
143165 suite .AddFinalizer (block .NewVolumeMountRequest (block .NamespaceName , volumeID ).Metadata (), "test" )
144166 }
145167
146- // drop the first volume
147- ctr , err = container .New (uv2 )
168+ // keep only the first volume
169+ ctr , err = container .New (uvPart1 )
148170 suite .Require ().NoError (err )
149171
150172 newCfg := config .NewMachineConfig (ctr )
@@ -153,32 +175,32 @@ func (suite *UserVolumeConfigSuite) TestReconcileUserVolumesSwapVolumes() {
153175
154176 // controller should tear down removed resources
155177 ctest .AssertResources (suite , userVolumes , func (vc * block.VolumeConfig , asrt * assert.Assertions ) {
156- if vc .Metadata ().ID () == userVolumes [1 ] {
178+ if vc .Metadata ().ID () == userVolumes [0 ] {
157179 asrt .Equal (resource .PhaseRunning , vc .Metadata ().Phase ())
158180 } else {
159181 asrt .Equal (resource .PhaseTearingDown , vc .Metadata ().Phase ())
160182 }
161183 })
162184
163185 ctest .AssertResources (suite , userVolumes , func (vmr * block.VolumeMountRequest , asrt * assert.Assertions ) {
164- if vmr .Metadata ().ID () == userVolumes [1 ] {
186+ if vmr .Metadata ().ID () == userVolumes [0 ] {
165187 asrt .Equal (resource .PhaseRunning , vmr .Metadata ().Phase ())
166188 } else {
167189 asrt .Equal (resource .PhaseTearingDown , vmr .Metadata ().Phase ())
168190 }
169191 })
170192
171193 // remove finalizers
172- suite . RemoveFinalizer ( block . NewVolumeConfig ( block . NamespaceName , userVolumes [0 ]). Metadata (), "test" )
173- suite .RemoveFinalizer (block .NewVolumeMountRequest (block .NamespaceName , userVolumes [ 0 ] ).Metadata (), "test" )
174- suite .RemoveFinalizer (block .NewVolumeConfig (block .NamespaceName , userVolumes [ 2 ] ).Metadata (), "test" )
175- suite . RemoveFinalizer ( block . NewVolumeMountRequest ( block . NamespaceName , userVolumes [ 2 ]). Metadata (), "test" )
194+ for _ , userVolume := range userVolumes [1 :] {
195+ suite .RemoveFinalizer (block .NewVolumeConfig (block .NamespaceName , userVolume ).Metadata (), "test" )
196+ suite .RemoveFinalizer (block .NewVolumeMountRequest (block .NamespaceName , userVolume ).Metadata (), "test" )
197+ }
176198
177199 // now the resources should be removed
178- ctest . AssertNoResource [ * block. VolumeConfig ]( suite , userVolumes [0 ])
179- ctest .AssertNoResource [* block.VolumeMountRequest ](suite , userVolumes [ 0 ] )
180- ctest .AssertNoResource [* block.VolumeConfig ](suite , userVolumes [ 2 ] )
181- ctest . AssertNoResource [ * block. VolumeMountRequest ]( suite , userVolumes [ 2 ])
200+ for _ , userVolume := range userVolumes [1 :] {
201+ ctest .AssertNoResource [* block.VolumeConfig ](suite , userVolume )
202+ ctest .AssertNoResource [* block.VolumeMountRequest ](suite , userVolume )
203+ }
182204}
183205
184206func (suite * UserVolumeConfigSuite ) TestReconcileRawVolumes () {
0 commit comments