Skip to content

Commit feed4a5

Browse files
committed
Abstract the storage to allow for local storage in tests and local development
1 parent 4010536 commit feed4a5

File tree

12 files changed

+109
-78
lines changed

12 files changed

+109
-78
lines changed

packages/orchestrator/cmd/simulate-headers-merge/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ import (
77
"log"
88
"os"
99

10+
"github.com/google/uuid"
11+
1012
"github.com/e2b-dev/infra/packages/shared/pkg/storage"
1113
"github.com/e2b-dev/infra/packages/shared/pkg/storage/gcs"
1214
"github.com/e2b-dev/infra/packages/shared/pkg/storage/header"
13-
"github.com/google/uuid"
1415
)
1516

1617
func main() {

packages/shared/pkg/storage/template.go

+31-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package storage
22

33
import (
44
"fmt"
5+
"os"
56
"path/filepath"
67

78
"github.com/e2b-dev/infra/packages/shared/pkg/storage/header"
89
)
910

1011
const (
11-
EnvsDisk = "/mnt/disks/fc-envs/v1"
12+
EnvsDisk = "/mnt/disks/fc-envs/v1"
13+
LocalStorageDir = "/tmp"
1214

1315
KernelsDir = "/fc-kernels"
1416
KernelMountDir = "/fc-vm"
@@ -37,13 +39,21 @@ const (
3739
// Path to the directory where the kernel can be accessed inside when the dirs are mounted.
3840
var KernelMountedPath = filepath.Join(KernelMountDir, KernelName)
3941

42+
type Type string
43+
44+
const (
45+
LocalStorage Type = "local"
46+
BucketStorage Type = "bucket"
47+
)
48+
4049
type TemplateFiles struct {
4150
TemplateId string
4251
BuildId string
4352
KernelVersion string
4453
FirecrackerVersion string
4554

46-
hugePages bool
55+
hugePages bool
56+
StorageType Type
4757
}
4858

4959
func NewTemplateFiles(
@@ -53,12 +63,22 @@ func NewTemplateFiles(
5363
firecrackerVersion string,
5464
hugePages bool,
5565
) *TemplateFiles {
66+
// Choose where are the template build data stored. Default to bucket storage.
67+
var storageType Type
68+
switch os.Getenv("TEMPLATE_STORAGE") {
69+
case "local":
70+
storageType = LocalStorage
71+
default:
72+
storageType = BucketStorage
73+
}
74+
5675
return &TemplateFiles{
5776
TemplateId: templateId,
5877
BuildId: buildId,
5978
KernelVersion: kernelVersion,
6079
FirecrackerVersion: firecrackerVersion,
6180
hugePages: hugePages,
81+
StorageType: storageType,
6282
}
6383
}
6484

@@ -112,7 +132,15 @@ func (t *TemplateFiles) StorageSnapfilePath() string {
112132
}
113133

114134
func (t *TemplateFiles) BuildDir() string {
115-
return filepath.Join(EnvsDisk, t.TemplateId, buildDirName, t.BuildId)
135+
var baseDir string
136+
switch t.StorageType {
137+
case LocalStorage:
138+
baseDir = LocalStorageDir
139+
default:
140+
baseDir = EnvsDisk
141+
}
142+
143+
return filepath.Join(baseDir, t.TemplateId, buildDirName, t.BuildId)
116144
}
117145

118146
func (t *TemplateFiles) BuildMemfilePath() string {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package storage
2+
3+
import (
4+
"context"
5+
6+
"github.com/e2b-dev/infra/packages/shared/pkg/storage/gcs"
7+
"github.com/e2b-dev/infra/packages/shared/pkg/storage/header"
8+
)
9+
10+
type TemplateBuild interface {
11+
Remove(ctx context.Context) error
12+
Upload(ctx context.Context, snapfilePath string, memfilePath *string, rootfsPath *string) chan error
13+
}
14+
15+
func NewTemplateBuild(
16+
memfileHeader *header.Header,
17+
rootfsHeader *header.Header,
18+
files *TemplateFiles,
19+
) TemplateBuild {
20+
switch files.StorageType {
21+
case LocalStorage:
22+
return &TemplateLocalBuild{files: files}
23+
default:
24+
return &TemplateBucketBuild{
25+
bucket: gcs.GetTemplateBucket(),
26+
memfileHeader: memfileHeader,
27+
rootfsHeader: rootfsHeader,
28+
files: files,
29+
}
30+
}
31+
}

packages/shared/pkg/storage/template_build.go packages/shared/pkg/storage/template_build_bucket.go

+8-21
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"github.com/e2b-dev/infra/packages/shared/pkg/storage/header"
1313
)
1414

15-
type TemplateBuild struct {
15+
type TemplateBucketBuild struct {
1616
files *TemplateFiles
1717

1818
memfileHeader *header.Header
@@ -21,20 +21,7 @@ type TemplateBuild struct {
2121
bucket *gcs.BucketHandle
2222
}
2323

24-
func NewTemplateBuild(
25-
memfileHeader *header.Header,
26-
rootfsHeader *header.Header,
27-
files *TemplateFiles,
28-
) *TemplateBuild {
29-
return &TemplateBuild{
30-
bucket: gcs.GetTemplateBucket(),
31-
memfileHeader: memfileHeader,
32-
rootfsHeader: rootfsHeader,
33-
files: files,
34-
}
35-
}
36-
37-
func (t *TemplateBuild) Remove(ctx context.Context) error {
24+
func (t *TemplateBucketBuild) Remove(ctx context.Context) error {
3825
err := gcs.RemoveDir(ctx, t.bucket, t.files.StorageDir())
3926
if err != nil {
4027
return fmt.Errorf("error when removing template build '%s': %w", t.files.StorageDir(), err)
@@ -43,7 +30,7 @@ func (t *TemplateBuild) Remove(ctx context.Context) error {
4330
return nil
4431
}
4532

46-
func (t *TemplateBuild) uploadMemfileHeader(ctx context.Context, h *header.Header) error {
33+
func (t *TemplateBucketBuild) uploadMemfileHeader(ctx context.Context, h *header.Header) error {
4734
object := gcs.NewObject(ctx, t.bucket, t.files.StorageMemfileHeaderPath())
4835

4936
serialized, err := header.Serialize(h.Metadata, h.Mapping)
@@ -59,7 +46,7 @@ func (t *TemplateBuild) uploadMemfileHeader(ctx context.Context, h *header.Heade
5946
return nil
6047
}
6148

62-
func (t *TemplateBuild) uploadMemfile(ctx context.Context, memfilePath string) error {
49+
func (t *TemplateBucketBuild) uploadMemfile(ctx context.Context, memfilePath string) error {
6350
object := gcs.NewObject(ctx, t.bucket, t.files.StorageMemfilePath())
6451

6552
err := object.UploadWithCli(ctx, memfilePath)
@@ -70,7 +57,7 @@ func (t *TemplateBuild) uploadMemfile(ctx context.Context, memfilePath string) e
7057
return nil
7158
}
7259

73-
func (t *TemplateBuild) uploadRootfsHeader(ctx context.Context, h *header.Header) error {
60+
func (t *TemplateBucketBuild) uploadRootfsHeader(ctx context.Context, h *header.Header) error {
7461
object := gcs.NewObject(ctx, t.bucket, t.files.StorageRootfsHeaderPath())
7562

7663
serialized, err := header.Serialize(h.Metadata, h.Mapping)
@@ -86,7 +73,7 @@ func (t *TemplateBuild) uploadRootfsHeader(ctx context.Context, h *header.Header
8673
return nil
8774
}
8875

89-
func (t *TemplateBuild) uploadRootfs(ctx context.Context, rootfsPath string) error {
76+
func (t *TemplateBucketBuild) uploadRootfs(ctx context.Context, rootfsPath string) error {
9077
object := gcs.NewObject(ctx, t.bucket, t.files.StorageRootfsPath())
9178

9279
err := object.UploadWithCli(ctx, rootfsPath)
@@ -98,7 +85,7 @@ func (t *TemplateBuild) uploadRootfs(ctx context.Context, rootfsPath string) err
9885
}
9986

10087
// Snapfile is small enough so we dont use composite upload.
101-
func (t *TemplateBuild) uploadSnapfile(ctx context.Context, snapfile io.Reader) error {
88+
func (t *TemplateBucketBuild) uploadSnapfile(ctx context.Context, snapfile io.Reader) error {
10289
object := gcs.NewObject(ctx, t.bucket, t.files.StorageSnapfilePath())
10390

10491
n, err := object.ReadFrom(snapfile)
@@ -109,7 +96,7 @@ func (t *TemplateBuild) uploadSnapfile(ctx context.Context, snapfile io.Reader)
10996
return nil
11097
}
11198

112-
func (t *TemplateBuild) Upload(
99+
func (t *TemplateBucketBuild) Upload(
113100
ctx context.Context,
114101
snapfilePath string,
115102
memfilePath *string,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package storage
2+
3+
import (
4+
"context"
5+
)
6+
7+
type TemplateLocalBuild struct {
8+
files *TemplateFiles
9+
}
10+
11+
func (t *TemplateLocalBuild) Remove(ctx context.Context) error {
12+
return nil
13+
}
14+
15+
func (t *TemplateLocalBuild) Upload(
16+
ctx context.Context,
17+
snapfilePath string,
18+
memfilePath *string,
19+
rootfsPath *string,
20+
) chan error {
21+
return make(chan error)
22+
}

packages/template-manager/cmd/build-template/main.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515

1616
"github.com/e2b-dev/infra/packages/shared/pkg/storage"
1717
"github.com/e2b-dev/infra/packages/template-manager/internal/build"
18-
"github.com/e2b-dev/infra/packages/template-manager/internal/template"
1918
)
2019

2120
func main() {
@@ -72,9 +71,7 @@ func Build(ctx context.Context, kernelVersion, fcVersion, templateID, buildID st
7271
return fmt.Errorf("error building template: %w", err)
7372
}
7473

75-
tempStorage := template.NewStorage(ctx)
76-
77-
buildStorage := tempStorage.NewBuild(t.TemplateFiles)
74+
buildStorage := storage.NewTemplateBuild(nil, nil, t.TemplateFiles)
7875

7976
memfilePath := t.BuildMemfilePath()
8077
rootfsPath := t.BuildRootfsPath()

packages/template-manager/internal/server/create_template.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ package server
33
import (
44
"context"
55
"fmt"
6-
"go.uber.org/zap"
7-
"go.uber.org/zap/zapcore"
86
"os/exec"
97
"strconv"
108
"strings"
119
"time"
1210

1311
"go.opentelemetry.io/otel/attribute"
12+
"go.uber.org/zap"
13+
"go.uber.org/zap/zapcore"
1414
"google.golang.org/grpc/metadata"
1515

1616
template_manager "github.com/e2b-dev/infra/packages/shared/pkg/grpc/template-manager"
@@ -63,7 +63,7 @@ func (s *serverStore) TemplateCreate(templateRequest *template_manager.TemplateC
6363
BuildLogsWriter: logsWriter,
6464
}
6565

66-
buildStorage := s.templateStorage.NewBuild(template.TemplateFiles)
66+
buildStorage := storage.NewTemplateBuild(nil, nil, template.TemplateFiles)
6767

6868
var err error
6969

packages/template-manager/internal/server/delete_template.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func (s *serverStore) TemplateBuildDelete(ctx context.Context, in *template_mana
1313
childCtx, childSpan := s.tracer.Start(ctx, "template-delete-request")
1414
defer childSpan.End()
1515

16-
err := template.Delete(childCtx, s.tracer, s.artifactRegistry, s.templateStorage, in.BuildID)
16+
err := template.Delete(childCtx, s.tracer, s.artifactRegistry, s.templateBuild, in.BuildID)
1717
if err != nil {
1818
return nil, err
1919
}

packages/template-manager/internal/server/main.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
artifactregistry "cloud.google.com/go/artifactregistry/apiv1"
88
"github.com/docker/docker/client"
99
docker "github.com/fsouza/go-dockerclient"
10+
1011
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
1112
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery"
1213
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/selector"
@@ -22,8 +23,8 @@ import (
2223
e2bgrpc "github.com/e2b-dev/infra/packages/shared/pkg/grpc"
2324
templatemanager "github.com/e2b-dev/infra/packages/shared/pkg/grpc/template-manager"
2425
l "github.com/e2b-dev/infra/packages/shared/pkg/logger"
26+
"github.com/e2b-dev/infra/packages/shared/pkg/storage"
2527
"github.com/e2b-dev/infra/packages/template-manager/internal/constants"
26-
"github.com/e2b-dev/infra/packages/template-manager/internal/template"
2728
)
2829

2930
type serverStore struct {
@@ -35,7 +36,7 @@ type serverStore struct {
3536
dockerClient *client.Client
3637
legacyDockerClient *docker.Client
3738
artifactRegistry *artifactregistry.Client
38-
templateStorage *template.Storage
39+
templateBuild storage.TemplateBuild
3940
}
4041

4142
func New(logger *zap.Logger, buildLogger *zap.Logger) *grpc.Server {
@@ -81,16 +82,13 @@ func New(logger *zap.Logger, buildLogger *zap.Logger) *grpc.Server {
8182
panic(err)
8283
}
8384

84-
templateStorage := template.NewStorage(ctx)
85-
8685
templatemanager.RegisterTemplateServiceServer(s, &serverStore{
8786
tracer: otel.Tracer(constants.ServiceName),
8887
logger: logger,
8988
buildLogger: buildLogger,
9089
dockerClient: dockerClient,
9190
legacyDockerClient: legacyClient,
9291
artifactRegistry: artifactRegistry,
93-
templateStorage: templateStorage,
9492
})
9593

9694
grpc_health_v1.RegisterHealthServer(s, health.NewServer())

packages/template-manager/internal/template/main.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import (
1010
"go.opentelemetry.io/otel/trace"
1111
"google.golang.org/grpc/codes"
1212

13+
"github.com/gogo/status"
14+
1315
"github.com/e2b-dev/infra/packages/shared/pkg/consts"
16+
"github.com/e2b-dev/infra/packages/shared/pkg/storage"
1417
"github.com/e2b-dev/infra/packages/shared/pkg/telemetry"
15-
"github.com/gogo/status"
1618
)
1719

1820
func GetDockerImageURL(templateID string) string {
@@ -24,13 +26,13 @@ func Delete(
2426
ctx context.Context,
2527
tracer trace.Tracer,
2628
artifactRegistry *artifactregistry.Client,
27-
templateStorage *Storage,
29+
templateBuild storage.TemplateBuild,
2830
buildId string,
2931
) error {
3032
childCtx, childSpan := tracer.Start(ctx, "delete-template")
3133
defer childSpan.End()
3234

33-
err := templateStorage.Remove(ctx, buildId)
35+
err := templateBuild.Remove(ctx)
3436
if err != nil {
3537
return fmt.Errorf("error when deleting template objects: %w", err)
3638
}

packages/template-manager/internal/template/storage.go

-32
This file was deleted.

0 commit comments

Comments
 (0)