@@ -30,6 +30,7 @@ import (
30
30
ksync "github.com/katexochen/sync/api/client"
31
31
"github.com/spf13/cobra"
32
32
"github.com/stretchr/testify/require"
33
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
33
34
)
34
35
35
36
// Flags contains the parsed Flags for the test.
@@ -178,8 +179,10 @@ func (ct *ContrastTest) Generate(t *testing.T) {
178
179
hash , err := os .ReadFile (path .Join (ct .WorkDir , "coordinator-policy.sha256" ))
179
180
require .NoError (err )
180
181
require .NotEmpty (hash , "expected apply to fill coordinator policy hash" )
181
-
182
- ct .PatchManifest (t , patchReferenceValues (ct .Platform ))
182
+ patchManifestFunc , err := patchReferenceValues (ct .Kubeclient , ct .Platform )
183
+ require .NoError (err )
184
+ ct .PatchManifest (t , patchManifestFunc )
185
+ ct .PatchManifest (t , addInvalidReferenceValues (ct .Platform ))
183
186
}
184
187
185
188
// PatchManifestFunc defines a function type allowing the given manifest to be modified.
@@ -197,12 +200,11 @@ func (ct *ContrastTest) PatchManifest(t *testing.T, patchFn PatchManifestFunc) {
197
200
require .NoError (t , os .WriteFile (ct .WorkDir + "/manifest.json" , manifestBytes , 0o644 ))
198
201
}
199
202
200
- // patchReferenceValues returns a PatchManifestFunc which modifies a manifest to contain multiple reference values for testing
201
- // cases with multiple validators, as well as filling in bare-metal SNP-specific values.
202
- func patchReferenceValues (platform platforms.Platform ) PatchManifestFunc {
203
+ // addInvalidReferenceValues returns a PatchManifestFunc which adds a fresh, invalid entry to the specified reference values.
204
+ func addInvalidReferenceValues (platform platforms.Platform ) PatchManifestFunc {
203
205
return func (m manifest.Manifest ) manifest.Manifest {
204
206
switch platform {
205
- case platforms .AKSCloudHypervisorSNP :
207
+ case platforms .MetalQEMUSNP , platforms . MetalQEMUSNPGPU , platforms . K3sQEMUSNP , platforms . K3sQEMUSNPGPU , platforms . AKSCloudHypervisorSNP :
206
208
// Duplicate the reference values to test multiple validators by having at least 2.
207
209
m .ReferenceValues .SNP = append (m .ReferenceValues .SNP , m .ReferenceValues .SNP [len (m .ReferenceValues .SNP )- 1 ])
208
210
@@ -213,27 +215,69 @@ func patchReferenceValues(platform platforms.Platform) PatchManifestFunc {
213
215
SNPVersion : toPtr (manifest .SVN (255 )),
214
216
MicrocodeVersion : toPtr (manifest .SVN (255 )),
215
217
}
218
+ case platforms .MetalQEMUTDX , platforms .K3sQEMUTDX , platforms .RKE2QEMUTDX :
219
+ // Duplicate the reference values to test multiple validators by having at least 2.
220
+ m .ReferenceValues .TDX = append (m .ReferenceValues .TDX , m .ReferenceValues .TDX [len (m .ReferenceValues .TDX )- 1 ])
221
+
222
+ // Make the last set of reference values invalid by changing the SVNs.
223
+ m .ReferenceValues .TDX [len (m .ReferenceValues .TDX )- 1 ].MinimumTeeTcbSvn = manifest .HexString ("11111111111111111111111111111111" )
224
+ m .ReferenceValues .TDX [len (m .ReferenceValues .TDX )- 1 ].MrSeam = manifest .HexString ("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" )
225
+ }
226
+ return m
227
+ }
228
+ }
229
+
230
+ // patchReferenceValues returns a PatchManifestFunc which modifies the reference values in a manifest
231
+ // based on the 'bm-tcb-specs' ConfigMap persistently stored in the 'default' namespace.
232
+ func patchReferenceValues (k * kubeclient.Kubeclient , platform platforms.Platform ) (PatchManifestFunc , error ) {
233
+ var baremetalRefVal manifest.ReferenceValues
234
+ // ConfigMap bm-tcb-specs will only exist on baremetal instances.
235
+ if platform != platforms .AKSCloudHypervisorSNP {
236
+ ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
237
+ defer cancel ()
238
+ configMap , err := k .Client .CoreV1 ().ConfigMaps ("default" ).Get (ctx , "bm-tcb-specs" , metav1.GetOptions {})
239
+ if err != nil {
240
+ return nil , fmt .Errorf ("getting ConfigMap bm-tcb-specs: %w" , err )
241
+ }
242
+ err = json .Unmarshal ([]byte (configMap .Data ["tcb-specs.json" ]), & baremetalRefVal )
243
+ if err != nil {
244
+ return nil , fmt .Errorf ("unmarshaling reference values: %w" , err )
245
+ }
246
+ }
247
+ return func (m manifest.Manifest ) manifest.Manifest {
248
+ switch platform {
216
249
case platforms .MetalQEMUSNP , platforms .MetalQEMUSNPGPU , platforms .K3sQEMUSNP , platforms .K3sQEMUSNPGPU :
217
- // The generate command doesn't fill in all required fields when
218
- // generating a manifest for baremetal SNP. Do that now.
219
- for i , snp := range m .ReferenceValues .SNP {
220
- snp .MinimumTCB .BootloaderVersion = toPtr (manifest .SVN (0 ))
221
- snp .MinimumTCB .TEEVersion = toPtr (manifest .SVN (0 ))
222
- snp .MinimumTCB .SNPVersion = toPtr (manifest .SVN (0 ))
223
- snp .MinimumTCB .MicrocodeVersion = toPtr (manifest .SVN (0 ))
224
- m .ReferenceValues .SNP [i ] = snp
250
+ // Overwrite the minimumTCB values with the ones loaded from the path tcbSpecificationFile.
251
+ var snpReferenceValues []manifest.SNPReferenceValues
252
+ for _ , manifestSNP := range m .ReferenceValues .SNP {
253
+ for _ , overwriteSNP := range baremetalRefVal .SNP {
254
+ if manifestSNP .ProductName == overwriteSNP .ProductName {
255
+ manifestSNP .MinimumTCB = overwriteSNP .MinimumTCB
256
+ // Filter to only use the reference values of specified baremetal SNP runners
257
+ snpReferenceValues = append (snpReferenceValues , manifestSNP )
258
+ }
259
+ }
225
260
}
261
+ m .ReferenceValues .SNP = snpReferenceValues
262
+
226
263
case platforms .MetalQEMUTDX , platforms .K3sQEMUTDX , platforms .RKE2QEMUTDX :
227
- // The generate command doesn't fill in all required fields when
228
- // generating a manifest for baremetal TDX. Do that now.
229
- for i , tdx := range m .ReferenceValues .TDX {
230
- tdx .MinimumTeeTcbSvn = manifest .HexString ("04010200000000000000000000000000" )
231
- tdx .MrSeam = manifest .HexString ("1cc6a17ab799e9a693fac7536be61c12ee1e0fabada82d0c999e08ccee2aa86de77b0870f558c570e7ffe55d6d47fa04" )
232
- m .ReferenceValues .TDX [i ] = tdx
264
+
265
+ // Overwrite the fields MinimumTeeTcbSvn and MrSeam with the ones loaded from the path tcbSpecificationFile.
266
+ var tdxReferenceValues []manifest.TDXReferenceValues
267
+ for _ , manifestTDX := range m .ReferenceValues .TDX {
268
+ for _ , overwriteTDX := range baremetalRefVal .TDX {
269
+ manifestTDX .MrSeam = overwriteTDX .MrSeam
270
+ manifestTDX .MinimumTeeTcbSvn = overwriteTDX .MinimumTeeTcbSvn
271
+ // Filter to only use the reference values of specified baremetal SNP runners
272
+ tdxReferenceValues = append (tdxReferenceValues , manifestTDX )
273
+ }
233
274
}
275
+ m .ReferenceValues .TDX = tdxReferenceValues
276
+
277
+ default :
234
278
}
235
279
return m
236
- }
280
+ }, nil
237
281
}
238
282
239
283
// Apply the generated resources to the Kubernetes test environment.
0 commit comments