Skip to content

Commit 662af0c

Browse files
committed
e2e/contrasttest: use real minimumTCB values on bare-metal runners
1 parent a8118f2 commit 662af0c

File tree

1 file changed

+65
-21
lines changed

1 file changed

+65
-21
lines changed

e2e/internal/contrasttest/contrasttest.go

+65-21
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
ksync "github.com/katexochen/sync/api/client"
3131
"github.com/spf13/cobra"
3232
"github.com/stretchr/testify/require"
33+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3334
)
3435

3536
// Flags contains the parsed Flags for the test.
@@ -178,8 +179,10 @@ func (ct *ContrastTest) Generate(t *testing.T) {
178179
hash, err := os.ReadFile(path.Join(ct.WorkDir, "coordinator-policy.sha256"))
179180
require.NoError(err)
180181
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))
183186
}
184187

185188
// 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) {
197200
require.NoError(t, os.WriteFile(ct.WorkDir+"/manifest.json", manifestBytes, 0o644))
198201
}
199202

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 {
203205
return func(m manifest.Manifest) manifest.Manifest {
204206
switch platform {
205-
case platforms.AKSCloudHypervisorSNP:
207+
case platforms.MetalQEMUSNP, platforms.MetalQEMUSNPGPU, platforms.K3sQEMUSNP, platforms.K3sQEMUSNPGPU, platforms.AKSCloudHypervisorSNP:
206208
// Duplicate the reference values to test multiple validators by having at least 2.
207209
m.ReferenceValues.SNP = append(m.ReferenceValues.SNP, m.ReferenceValues.SNP[len(m.ReferenceValues.SNP)-1])
208210

@@ -213,27 +215,69 @@ func patchReferenceValues(platform platforms.Platform) PatchManifestFunc {
213215
SNPVersion: toPtr(manifest.SVN(255)),
214216
MicrocodeVersion: toPtr(manifest.SVN(255)),
215217
}
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 {
216249
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+
}
225260
}
261+
m.ReferenceValues.SNP = snpReferenceValues
262+
226263
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+
}
233274
}
275+
m.ReferenceValues.TDX = tdxReferenceValues
276+
277+
default:
234278
}
235279
return m
236-
}
280+
}, nil
237281
}
238282

239283
// Apply the generated resources to the Kubernetes test environment.

0 commit comments

Comments
 (0)