Skip to content

Commit b163971

Browse files
authored
Merge pull request #352 from oasisprotocol/kostko/feature/rofl-init-set-artifacts
feat(cmd/rofl): Store artifacts on init for reproducible builds
2 parents 4f90a10 + 5be933d commit b163971

File tree

5 files changed

+106
-83
lines changed

5 files changed

+106
-83
lines changed

build/rofl/artifacts.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package rofl
2+
3+
// LatestBasicArtifacts are the latest TDX ROFL basic app artifacts.
4+
var LatestBasicArtifacts = ArtifactsConfig{
5+
Firmware: "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/ovmf.tdx.fd#db47100a7d6a0c1f6983be224137c3f8d7cb09b63bb1c7a5ee7829d8e994a42f",
6+
Kernel: "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage1.bin#539f25c66a27b2ca3c6b4d3333b88c64e531fcc96776c37a12c9ce06dd7fbac9",
7+
Stage2: "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage2-basic.tar.bz2#72c84d2566959799fdd98fae08c143a8572a5a09ee426be376f9a8bbd1675f2b",
8+
}
9+
10+
// LatestContainerArtifacts are the latest TDX container app artifacts.
11+
var LatestContainerArtifacts = ArtifactsConfig{
12+
Firmware: "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/ovmf.tdx.fd#db47100a7d6a0c1f6983be224137c3f8d7cb09b63bb1c7a5ee7829d8e994a42f",
13+
Kernel: "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage1.bin#539f25c66a27b2ca3c6b4d3333b88c64e531fcc96776c37a12c9ce06dd7fbac9",
14+
Stage2: "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage2-podman.tar.bz2#827531546f3db6b0945ece7ddab4e10d648eaa3ba1c146b7889d7cb9cbf0b507",
15+
Container: ContainerArtifactsConfig{
16+
Runtime: "https://github.com/oasisprotocol/oasis-sdk/releases/download/rofl-containers%2Fv0.3.4/rofl-containers#d6a055b2e88e1f321e3ab1f73046444e24df9d8925d13cc6b8230de9a81e5c41",
17+
Compose: "compose.yaml",
18+
},
19+
}

cmd/rofl/build/container.go

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,6 @@ import (
1212
"github.com/oasisprotocol/cli/cmd/common"
1313
)
1414

15-
const (
16-
artifactContainerRuntime = "rofl-container runtime"
17-
artifactContainerCompose = "compose.yaml"
18-
19-
defaultContainerStage2TemplateURI = "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage2-podman.tar.bz2#827531546f3db6b0945ece7ddab4e10d648eaa3ba1c146b7889d7cb9cbf0b507"
20-
21-
defaultContainerRuntimeURI = "https://github.com/oasisprotocol/oasis-sdk/releases/download/rofl-containers%2Fv0.3.3/rofl-containers#b7f025e3bb844a4ce044fa3a2503f6854e5e2d2d5ec22be919c582e57cf5d6ab"
22-
23-
defaultContainerComposeURI = "compose.yaml"
24-
)
25-
2615
// tdxBuildContainer builds a TDX-based container ROFL app.
2716
func tdxBuildContainer(
2817
tmpDir string,
@@ -33,20 +22,7 @@ func tdxBuildContainer(
3322
) error {
3423
fmt.Println("Building a container-based TDX ROFL application...")
3524

36-
tdxStage2TemplateURI = defaultContainerStage2TemplateURI
37-
38-
wantedArtifacts := tdxGetDefaultArtifacts()
39-
wantedArtifacts = append(wantedArtifacts,
40-
&artifact{
41-
kind: artifactContainerRuntime,
42-
uri: defaultContainerRuntimeURI,
43-
},
44-
&artifact{
45-
kind: artifactContainerCompose,
46-
uri: defaultContainerComposeURI,
47-
},
48-
)
49-
tdxOverrideArtifacts(manifest, wantedArtifacts)
25+
wantedArtifacts := tdxWantedArtifacts(manifest, buildRofl.LatestContainerArtifacts)
5026
artifacts := tdxFetchArtifacts(wantedArtifacts)
5127

5228
// Validate compose file.

cmd/rofl/build/tdx.go

Lines changed: 32 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,13 @@ import (
1616
"github.com/oasisprotocol/cli/cmd/common"
1717
)
1818

19-
// TODO: Replace these URIs with a better mechanism for managing releases.
19+
// Artifact kinds.
2020
const (
21-
artifactFirmware = "firmware"
22-
artifactKernel = "kernel"
23-
artifactStage2 = "stage 2 template"
24-
25-
defaultFirmwareURI = "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/ovmf.tdx.fd#db47100a7d6a0c1f6983be224137c3f8d7cb09b63bb1c7a5ee7829d8e994a42f"
26-
defaultKernelURI = "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage1.bin#539f25c66a27b2ca3c6b4d3333b88c64e531fcc96776c37a12c9ce06dd7fbac9"
27-
defaultStage2TemplateURI = "https://github.com/oasisprotocol/oasis-boot/releases/download/v0.3.3/stage2-basic.tar.bz2#72c84d2566959799fdd98fae08c143a8572a5a09ee426be376f9a8bbd1675f2b"
28-
)
29-
30-
var (
31-
tdxFirmwareURI = defaultFirmwareURI
32-
tdxKernelURI = defaultKernelURI
33-
tdxStage2TemplateURI = defaultStage2TemplateURI
21+
artifactFirmware = "firmware"
22+
artifactKernel = "kernel"
23+
artifactStage2 = "stage 2 template"
24+
artifactContainerRuntime = "rofl-container runtime"
25+
artifactContainerCompose = "compose.yaml"
3426
)
3527

3628
// tdxBuildRaw builds a TDX-based "raw" ROFL app.
@@ -41,8 +33,7 @@ func tdxBuildRaw(
4133
deployment *buildRofl.Deployment,
4234
bnd *bundle.Bundle,
4335
) error {
44-
wantedArtifacts := tdxGetDefaultArtifacts()
45-
tdxOverrideArtifacts(manifest, wantedArtifacts)
36+
wantedArtifacts := tdxWantedArtifacts(manifest, buildRofl.LatestBasicArtifacts)
4637
artifacts := tdxFetchArtifacts(wantedArtifacts)
4738

4839
fmt.Println("Building a TDX-based Rust ROFL application...")
@@ -87,13 +78,32 @@ type artifact struct {
8778
uri string
8879
}
8980

90-
// tdxGetDefaultArtifacts returns the list of default TDX artifacts.
91-
func tdxGetDefaultArtifacts() []*artifact {
92-
return []*artifact{
93-
{artifactFirmware, tdxFirmwareURI},
94-
{artifactKernel, tdxKernelURI},
95-
{artifactStage2, tdxStage2TemplateURI},
81+
// tdxWantedArtifacts returns the list of wanted artifacts based on the passed manifest and a set of
82+
// defaults. In case an artifact is not defined in the manifest, it is taken from defaults.
83+
func tdxWantedArtifacts(manifest *buildRofl.Manifest, defaults buildRofl.ArtifactsConfig) []*artifact {
84+
var artifacts []*artifact
85+
for _, a := range []struct {
86+
kind string
87+
getter func(*buildRofl.ArtifactsConfig) string
88+
}{
89+
{artifactFirmware, func(ac *buildRofl.ArtifactsConfig) string { return ac.Firmware }},
90+
{artifactKernel, func(ac *buildRofl.ArtifactsConfig) string { return ac.Kernel }},
91+
{artifactStage2, func(ac *buildRofl.ArtifactsConfig) string { return ac.Stage2 }},
92+
{artifactContainerRuntime, func(ac *buildRofl.ArtifactsConfig) string { return ac.Container.Runtime }},
93+
{artifactContainerCompose, func(ac *buildRofl.ArtifactsConfig) string { return ac.Container.Compose }},
94+
} {
95+
var uri string
96+
if manifest.Artifacts != nil {
97+
uri = a.getter(manifest.Artifacts)
98+
}
99+
if uri == "" {
100+
uri = a.getter(&defaults)
101+
}
102+
if uri != "" {
103+
artifacts = append(artifacts, &artifact{a.kind, uri})
104+
}
96105
}
106+
return artifacts
97107
}
98108

99109
// tdxFetchArtifacts obtains all of the required artifacts for a TDX image.
@@ -105,36 +115,6 @@ func tdxFetchArtifacts(artifacts []*artifact) map[string]string {
105115
return result
106116
}
107117

108-
// tdxOverrideArtifacts overrides artifacts based on the manifest.
109-
func tdxOverrideArtifacts(manifest *buildRofl.Manifest, artifacts []*artifact) {
110-
if manifest == nil || manifest.Artifacts == nil {
111-
return
112-
}
113-
overrides := manifest.Artifacts
114-
115-
for _, artifact := range artifacts {
116-
var overrideURI string
117-
switch artifact.kind {
118-
case artifactFirmware:
119-
overrideURI = overrides.Firmware
120-
case artifactKernel:
121-
overrideURI = overrides.Kernel
122-
case artifactStage2:
123-
overrideURI = overrides.Stage2
124-
case artifactContainerRuntime:
125-
overrideURI = overrides.Container.Runtime
126-
case artifactContainerCompose:
127-
overrideURI = overrides.Container.Compose
128-
default:
129-
}
130-
131-
if overrideURI == "" {
132-
continue
133-
}
134-
artifact.uri = overrideURI
135-
}
136-
}
137-
138118
type tdxStage2 struct {
139119
fn string
140120
rootHash string

cmd/rofl/mgmt.go

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ var (
8787
height, err := common.GetActualHeight(ctx, conn.Consensus())
8888
cobra.CheckErr(err)
8989

90+
blk, err := conn.Consensus().GetBlock(ctx, height)
91+
cobra.CheckErr(err)
92+
9093
// Determine debug mode.
9194
var debugMode bool
9295
params, err := conn.Consensus().Registry().ConsensusParameters(ctx, height)
@@ -116,6 +119,7 @@ var (
116119
},
117120
TrustRoot: &buildRofl.TrustRootConfig{
118121
Height: uint64(height),
122+
Hash: blk.Hash.Hex(),
119123
},
120124
}
121125
manifest := buildRofl.Manifest{
@@ -149,13 +153,25 @@ var (
149153
fmt.Printf(" Debug: %v\n", deployment.Debug)
150154
fmt.Printf(" Admin: %s\n", deployment.Admin)
151155

152-
// For container app kind also create an en empty compose.yaml file if it doesn't exist.
153-
if appKind == buildRofl.AppKindContainer {
154-
var f *os.File
155-
f, err = os.OpenFile("compose.yaml", os.O_RDONLY|os.O_CREATE, 0o644)
156-
if err == nil {
157-
f.Close()
156+
switch manifest.TEE {
157+
case buildRofl.TEETypeTDX:
158+
switch appKind {
159+
case buildRofl.AppKindRaw:
160+
artifacts := buildRofl.LatestBasicArtifacts // Copy.
161+
manifest.Artifacts = &artifacts
162+
case buildRofl.AppKindContainer:
163+
// For container app kind also create an en empty compose.yaml file if it doesn't exist.
164+
var f *os.File
165+
f, err = os.OpenFile("compose.yaml", os.O_RDONLY|os.O_CREATE, 0o644)
166+
if err == nil {
167+
f.Close()
168+
}
169+
170+
artifacts := buildRofl.LatestContainerArtifacts // Copy.
171+
manifest.Artifacts = &artifacts
172+
default:
158173
}
174+
default:
159175
}
160176

161177
// Serialize manifest and write it to file.
@@ -463,6 +479,37 @@ var (
463479
},
464480
}
465481

482+
upgradeCmd = &cobra.Command{
483+
Use: "upgrade",
484+
Short: "Upgrade all artifacts to their latest default versions",
485+
Args: cobra.NoArgs,
486+
Run: func(_ *cobra.Command, _ []string) {
487+
cfg := cliConfig.Global()
488+
npa := common.GetNPASelection(cfg)
489+
490+
manifest, _ := roflCommon.LoadManifestAndSetNPA(cfg, npa, deploymentName, false)
491+
492+
switch manifest.TEE {
493+
case buildRofl.TEETypeTDX:
494+
switch manifest.Kind {
495+
case buildRofl.AppKindRaw:
496+
artifacts := buildRofl.LatestBasicArtifacts // Copy.
497+
manifest.Artifacts = &artifacts
498+
case buildRofl.AppKindContainer:
499+
artifacts := buildRofl.LatestContainerArtifacts // Copy.
500+
manifest.Artifacts = &artifacts
501+
default:
502+
}
503+
default:
504+
}
505+
506+
// Update manifest.
507+
if err := manifest.Save(); err != nil {
508+
cobra.CheckErr(fmt.Errorf("failed to update manifest: %w", err))
509+
}
510+
},
511+
}
512+
466513
secretCmd = &cobra.Command{
467514
Use: "secret",
468515
Short: "Encrypted secret management commands",

cmd/rofl/rofl.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ func init() {
2222
Cmd.AddCommand(build.Cmd)
2323
Cmd.AddCommand(identityCmd)
2424
Cmd.AddCommand(secretCmd)
25+
Cmd.AddCommand(upgradeCmd)
2526
}

0 commit comments

Comments
 (0)