mirror of
https://github.com/edgelesssys/constellation.git
synced 2025-08-08 15:02:18 -04:00
api: refactor attestationconfigapi client/fetcher
There is now one SEVSNPVersions type that has a variant property. That property is used to build the correct JSON path. The surrounding methods handling the version objects are also updated to receive a variant argument and work for multiple variants. This simplifies adding AWS support.
This commit is contained in:
parent
5542f9c63c
commit
350397923f
16 changed files with 411 additions and 262 deletions
113
internal/api/attestationconfigapi/snp.go
Normal file
113
internal/api/attestationconfigapi/snp.go
Normal file
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
Copyright (c) Edgeless Systems GmbH
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package attestationconfigapi
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/edgelesssys/constellation/v2/internal/attestation/variant"
|
||||
)
|
||||
|
||||
// attestationURLPath is the URL path to the attestation versions.
|
||||
const attestationURLPath = "constellation/v1/attestation"
|
||||
|
||||
// SEVSNPVersion tracks the latest version of each component of the Azure SEVSNP.
|
||||
type SEVSNPVersion struct {
|
||||
// Bootloader is the latest version of the Azure SEVSNP bootloader.
|
||||
Bootloader uint8 `json:"bootloader"`
|
||||
// TEE is the latest version of the Azure SEVSNP TEE.
|
||||
TEE uint8 `json:"tee"`
|
||||
// SNP is the latest version of the Azure SEVSNP SNP.
|
||||
SNP uint8 `json:"snp"`
|
||||
// Microcode is the latest version of the Azure SEVSNP microcode.
|
||||
Microcode uint8 `json:"microcode"`
|
||||
}
|
||||
|
||||
// SEVSNPVersionAPI is the request to get the version information of the specific version in the config api.
|
||||
// Because variant is not part of the marshalled JSON, fetcher and client methods need to fill the variant property.
|
||||
// Once we switch to v2 of the API we should embed the variant in the object.
|
||||
// That would remove the possibility of some fetcher/client code forgetting to set the variant.
|
||||
type SEVSNPVersionAPI struct {
|
||||
Version string `json:"-"`
|
||||
Variant variant.Variant `json:"-"`
|
||||
SEVSNPVersion
|
||||
}
|
||||
|
||||
// JSONPath returns the path to the JSON file for the request to the config api.
|
||||
func (i SEVSNPVersionAPI) JSONPath() string {
|
||||
return path.Join(attestationURLPath, i.Variant.String(), i.Version)
|
||||
}
|
||||
|
||||
// ValidateRequest validates the request.
|
||||
func (i SEVSNPVersionAPI) ValidateRequest() error {
|
||||
if !strings.HasSuffix(i.Version, ".json") {
|
||||
return fmt.Errorf("version has no .json suffix")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate is a No-Op at the moment.
|
||||
func (i SEVSNPVersionAPI) Validate() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// SEVSNPVersionList is the request to list all versions in the config api.
|
||||
// Because variant is not part of the marshalled JSON, fetcher and client methods need to fill the variant property.
|
||||
// Once we switch to v2 of the API we could embed the variant in the object and remove some code from fetcher & client.
|
||||
// That would remove the possibility of some fetcher/client code forgetting to set the variant.
|
||||
type SEVSNPVersionList struct {
|
||||
variant variant.Variant
|
||||
list []string
|
||||
}
|
||||
|
||||
// MarshalJSON marshals the i's list property to JSON.
|
||||
func (i SEVSNPVersionList) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(i.list)
|
||||
}
|
||||
|
||||
// UnmarshalJSON unmarshals a list of strings into i's list property.
|
||||
func (i *SEVSNPVersionList) UnmarshalJSON(data []byte) error {
|
||||
return json.Unmarshal(data, &i.list)
|
||||
}
|
||||
|
||||
// List returns i's list property.
|
||||
func (i SEVSNPVersionList) List() []string { return i.list }
|
||||
|
||||
// JSONPath returns the path to the JSON file for the request to the config api.
|
||||
func (i SEVSNPVersionList) JSONPath() string {
|
||||
return path.Join(attestationURLPath, i.variant.String(), "list")
|
||||
}
|
||||
|
||||
// ValidateRequest is a NoOp as there is no input.
|
||||
func (i SEVSNPVersionList) ValidateRequest() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// SortReverse sorts the list of versions in reverse order.
|
||||
func (i *SEVSNPVersionList) SortReverse() {
|
||||
sort.Sort(sort.Reverse(sort.StringSlice(i.list)))
|
||||
}
|
||||
|
||||
// addVersion adds new to i's list and sorts the element in descending order.
|
||||
func (i *SEVSNPVersionList) addVersion(new string) {
|
||||
i.list = append(i.list, new)
|
||||
i.list = variant.RemoveDuplicate(i.list)
|
||||
|
||||
i.SortReverse()
|
||||
}
|
||||
|
||||
// Validate validates the response.
|
||||
func (i SEVSNPVersionList) Validate() error {
|
||||
if len(i.list) < 1 {
|
||||
return fmt.Errorf("no versions found in /list")
|
||||
}
|
||||
return nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue