Skip to content

Commit 4a9ed32

Browse files
committed
[pvc] fix prebuilds when using pvc
1 parent 249a563 commit 4a9ed32

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

components/content-service/pkg/layer/provider.go

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,12 @@ func (s *Provider) GetContentLayerPVC(ctx context.Context, owner, workspaceID st
264264
if err != nil {
265265
return nil, nil, err
266266
}
267+
layerReady, err := workspaceReadyLayerPVC(csapi.WorkspaceInitFromBackup)
268+
if err != nil {
269+
return nil, nil, err
270+
}
267271

268-
l = []Layer{*layer}
272+
l = []Layer{*layer, *layerReady}
269273
return l, manifest, nil
270274
}
271275

@@ -274,8 +278,12 @@ func (s *Provider) GetContentLayerPVC(ctx context.Context, owner, workspaceID st
274278
if err != nil {
275279
return nil, nil, err
276280
}
281+
layerReady, err := workspaceReadyLayerPVC(csapi.WorkspaceInitFromBackup)
282+
if err != nil {
283+
return nil, nil, err
284+
}
277285

278-
l = []Layer{*layer}
286+
l = []Layer{*layer, *layerReady}
279287
return l, manifest, nil
280288
}
281289

@@ -287,8 +295,12 @@ func (s *Provider) GetContentLayerPVC(ctx context.Context, owner, workspaceID st
287295
if err != nil {
288296
return nil, nil, err
289297
}
298+
layerReady, err := workspaceReadyLayerPVC(csapi.WorkspaceInitFromOther)
299+
if err != nil {
300+
return nil, nil, err
301+
}
290302

291-
l = []Layer{*layer}
303+
l = []Layer{*layer, *layerReady}
292304
return l, manifest, nil
293305
}
294306
return s.getSnapshotContentLayer(ctx, gis)
@@ -299,8 +311,13 @@ func (s *Provider) GetContentLayerPVC(ctx context.Context, owner, workspaceID st
299311
if err != nil {
300312
return nil, nil, err
301313
}
314+
layerReady, err := workspaceReadyLayerPVC(csapi.WorkspaceInitFromPrebuild)
315+
if err != nil {
316+
return nil, nil, err
317+
}
318+
319+
l = []Layer{*layer, *layerReady}
302320

303-
l = []Layer{*layer}
304321
return l, manifest, nil
305322
}
306323
l, manifest, err = s.getPrebuildContentLayer(ctx, pis, true)
@@ -341,7 +358,11 @@ func (s *Provider) GetContentLayerPVC(ctx context.Context, owner, workspaceID st
341358
if err != nil {
342359
return nil, nil, err
343360
}
344-
return []Layer{*layer}, nil, nil
361+
layerReady, err := workspaceReadyLayerPVC(csapi.WorkspaceInitFromOther)
362+
if err != nil {
363+
return nil, nil, err
364+
}
365+
return []Layer{*layer, *layerReady}, nil, nil
345366
}
346367
if initializer.GetBackup() != nil {
347368
// We were asked to restore a backup and have tried above. We've failed to restore the backup,
@@ -508,13 +529,16 @@ git log --pretty=%H -n 1 > /.workspace/prestophookdata/git_log_2.txt
508529
cp /workspace/.gitpod/prebuild-log* /.workspace/prestophookdata/
509530
`
510531

532+
var pvcEnabledFile = `PVC`
533+
511534
// version of this function for persistent volume claim feature
512535
// we cannot use /workspace folder as when mounting /workspace folder through PVC
513536
// it will mask anything that was in container layer, hence we are using /.workspace instead here
514537
func contentDescriptorToLayerPVC(cdesc []byte) (*Layer, error) {
515538
layers := []fileInLayer{
516539
{&tar.Header{Typeflag: tar.TypeDir, Name: "/.workspace", Uid: initializer.GitpodUID, Gid: initializer.GitpodGID, Mode: 0755}, nil},
517540
{&tar.Header{Typeflag: tar.TypeDir, Name: "/.workspace/.gitpod", Uid: initializer.GitpodUID, Gid: initializer.GitpodGID, Mode: 0755}, nil},
541+
{&tar.Header{Typeflag: tar.TypeReg, Name: "/.workspace/.gitpod/pvc", Uid: 0, Gid: 0, Mode: 0775, Size: int64(len(pvcEnabledFile))}, []byte(pvcEnabledFile)},
518542
{&tar.Header{Typeflag: tar.TypeReg, Name: "/.supervisor/prestophook.sh", Uid: 0, Gid: 0, Mode: 0775, Size: int64(len(prestophookScript))}, []byte(prestophookScript)},
519543
}
520544
if len(cdesc) > 0 {
@@ -523,6 +547,22 @@ func contentDescriptorToLayerPVC(cdesc []byte) (*Layer, error) {
523547
return layerFromContent(layers...)
524548
}
525549

550+
func workspaceReadyLayerPVC(src csapi.WorkspaceInitSource) (*Layer, error) {
551+
msg := csapi.WorkspaceReadyMessage{
552+
Source: src,
553+
}
554+
ctnt, err := json.Marshal(msg)
555+
if err != nil {
556+
return nil, err
557+
}
558+
559+
return layerFromContent(
560+
fileInLayer{&tar.Header{Typeflag: tar.TypeDir, Name: "/.workspace", Uid: initializer.GitpodUID, Gid: initializer.GitpodGID, Mode: 0755}, nil},
561+
fileInLayer{&tar.Header{Typeflag: tar.TypeDir, Name: "/.workspace/.gitpod", Uid: initializer.GitpodUID, Gid: initializer.GitpodGID, Mode: 0755}, nil},
562+
fileInLayer{&tar.Header{Typeflag: tar.TypeReg, Name: "/.workspace/.gitpod/ready", Uid: initializer.GitpodUID, Gid: initializer.GitpodGID, Mode: 0755, Size: int64(len(ctnt))}, []byte(ctnt)},
563+
)
564+
}
565+
526566
func workspaceReadyLayer(src csapi.WorkspaceInitSource) (*Layer, error) {
527567
msg := csapi.WorkspaceReadyMessage{
528568
Source: src,

components/supervisor/pkg/supervisor/supervisor.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,9 +1327,10 @@ func startContentInit(ctx context.Context, cfg *Config, wg *sync.WaitGroup, cst
13271327

13281328
fn := "/workspace/.gitpod/content.json"
13291329
fnReady := "/workspace/.gitpod/ready"
1330-
if _, err := os.Stat("/.workspace/.gitpod/content.json"); !os.IsNotExist(err) {
1330+
if _, err := os.Stat("/.workspace/.gitpod/pvc"); !os.IsNotExist(err) {
13311331
fn = "/.workspace/.gitpod/content.json"
1332-
log.Info("Detected content.json in /.workspace folder, assuming PVC feature enabled")
1332+
fnReady = "/.workspace/.gitpod/ready"
1333+
log.Info("Detected pvc file in /.workspace folder, assuming PVC feature enabled")
13331334
}
13341335

13351336
var contentFile *os.File

0 commit comments

Comments
 (0)