Skip to content

Commit 808fc26

Browse files
committed
[registry-facade] refactor ide image layer
1 parent 2e85f2f commit 808fc26

File tree

4 files changed

+111
-116
lines changed

4 files changed

+111
-116
lines changed

components/registry-facade-api/go/imagespec.pb.go

Lines changed: 37 additions & 49 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/registry-facade-api/imagespec.proto

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ message ImageSpec {
1212
string ide_ref = 2;
1313
// content_layer describe the last few layers which provide the workspace's content
1414
repeated ContentLayer content_layer = 3;
15-
// desktop_ide_ref points to an image denotign the desktop IDE to use
16-
string desktop_ide_ref = 4;
15+
// was used for desktop_ide_ref points to an image denotign the desktop IDE to use
16+
reserved 4;
1717
// supervisor_ref points to an image denotign the supervisor to use
1818
string supervisor_ref = 5;
19-
// desktop_ide_plugin_ref points to an image denotign the desktop IDE plugin to use
20-
string desktop_ide_plugin_ref = 6;
19+
// was used for desktop_ide_plugin_ref points to an image denotign the desktop IDE plugin to use
20+
reserved 6;
21+
// ide_layer_ref contains all these layers needed by ide except `web-ide` and `supervisor`
22+
repeated string ide_layer_ref = 7;
2123
}
2224

2325
// ContentLayer is a layer that provides a workspace's content

components/registry-facade/pkg/registry/layersource.go

Lines changed: 63 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ func (cs CompositeLayerSource) GetBlob(ctx context.Context, spec *api.ImageSpec,
366366
}
367367

368368
// RefSource extracts an image reference from an image spec
369-
type RefSource func(*api.ImageSpec) (ref string, err error)
369+
type RefSource func(*api.ImageSpec) (ref []string, err error)
370370

371371
// NewSpecMappedImageSource creates a new spec mapped image source
372372
func NewSpecMappedImageSource(resolver ResolverProvider, refSource RefSource) (*SpecMappedImagedSource, error) {
@@ -392,71 +392,104 @@ type SpecMappedImagedSource struct {
392392

393393
// Envs returns the list of env modifiers
394394
func (src *SpecMappedImagedSource) Envs(ctx context.Context, spec *api.ImageSpec) ([]EnvModifier, error) {
395-
lsrc, err := src.getDelegate(ctx, spec)
395+
lsrcs, err := src.getDelegate(ctx, spec)
396396
if err != nil {
397397
return nil, err
398398
}
399-
if lsrc == nil {
400-
return []EnvModifier{}, nil
399+
var res []EnvModifier
400+
for _, lsrc := range lsrcs {
401+
if lsrc == nil {
402+
continue
403+
}
404+
envs, err := lsrc.Envs(ctx, spec)
405+
if err != nil {
406+
return nil, err
407+
}
408+
res = append(res, envs...)
401409
}
402-
return lsrc.Envs(ctx, spec)
410+
return res, nil
403411
}
404412

405413
// GetLayer returns the list of all layers from this source
406414
func (src *SpecMappedImagedSource) GetLayer(ctx context.Context, spec *api.ImageSpec) ([]AddonLayer, error) {
407-
lsrc, err := src.getDelegate(ctx, spec)
415+
lsrcs, err := src.getDelegate(ctx, spec)
408416
if err != nil {
409417
return nil, err
410418
}
411-
if lsrc == nil {
412-
return []AddonLayer{}, nil
419+
var res []AddonLayer
420+
for _, lsrc := range lsrcs {
421+
if lsrc == nil {
422+
continue
423+
}
424+
ls, err := lsrc.GetLayer(ctx, spec)
425+
if err != nil {
426+
return nil, err
427+
}
428+
res = append(res, ls...)
413429
}
414-
return lsrc.GetLayer(ctx, spec)
430+
return res, nil
415431
}
416432

417433
// HasBlob checks if a digest can be served by this blob source
418434
func (src *SpecMappedImagedSource) HasBlob(ctx context.Context, spec *api.ImageSpec, dgst digest.Digest) bool {
419-
lsrc, err := src.getDelegate(ctx, spec)
435+
lsrcs, err := src.getDelegate(ctx, spec)
420436
if err != nil {
421437
return false
422438
}
423-
if lsrc == nil {
424-
return false
439+
for _, lsrc := range lsrcs {
440+
if lsrc == nil {
441+
continue
442+
}
443+
if lsrc.HasBlob(ctx, spec, dgst) {
444+
return true
445+
}
425446
}
426-
return lsrc.HasBlob(ctx, spec, dgst)
447+
return false
427448
}
428449

429450
// GetBlob provides access to a blob. If a ReadCloser is returned the receiver is expected to
430451
// call close on it eventually.
431452
func (src *SpecMappedImagedSource) GetBlob(ctx context.Context, spec *api.ImageSpec, dgst digest.Digest) (dontCache bool, mediaType string, url string, data io.ReadCloser, err error) {
432-
lsrc, err := src.getDelegate(ctx, spec)
453+
lsrcs, err := src.getDelegate(ctx, spec)
433454
if err != nil {
434455
return
435456
}
436-
return lsrc.GetBlob(ctx, spec, dgst)
457+
for _, lsrc := range lsrcs {
458+
if lsrc == nil {
459+
continue
460+
}
461+
if lsrc.HasBlob(ctx, spec, dgst) {
462+
return lsrc.GetBlob(ctx, spec, dgst)
463+
}
464+
}
465+
err = errdefs.ErrNotFound
466+
return
437467
}
438468

439469
// getDelegate returns the cached layer source delegate computed from the image spec
440-
func (src *SpecMappedImagedSource) getDelegate(ctx context.Context, spec *api.ImageSpec) (LayerSource, error) {
441-
ref, err := src.RefSource(spec)
470+
func (src *SpecMappedImagedSource) getDelegate(ctx context.Context, spec *api.ImageSpec) ([]LayerSource, error) {
471+
refs, err := src.RefSource(spec)
442472
if err != nil {
443473
return nil, err
444474
}
445-
if ref == "" {
446-
return nil, nil
447-
}
448-
449-
if s, ok := src.cache.Get(ref); ok {
450-
return s.(LayerSource), nil
451-
}
475+
layers := make([]LayerSource, len(refs))
452476

453-
lsrc, err := NewStaticSourceFromImage(ctx, src.Resolver(), ref)
454-
if err != nil {
455-
return nil, err
477+
for i, ref := range refs {
478+
if ref == "" {
479+
continue
480+
}
481+
if s, ok := src.cache.Get(ref); ok {
482+
layers[i] = s.(LayerSource)
483+
continue
484+
}
485+
lsrc, err := NewStaticSourceFromImage(ctx, src.Resolver(), ref)
486+
if err != nil {
487+
return nil, err
488+
}
489+
src.cache.Add(ref, lsrc)
490+
layers[i] = lsrc
456491
}
457-
src.cache.Add(ref, lsrc)
458-
459-
return lsrc, nil
492+
return layers, nil
460493
}
461494

462495
// NewContentLayerSource creates a new layer source providing the content layer of an image spec

components/registry-facade/pkg/registry/registry.go

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -142,46 +142,18 @@ func NewRegistry(cfg config.Config, newResolver ResolverProvider, reg prometheus
142142
staticLayer.Update(l)
143143
}
144144

145-
// IDE layer
146-
ideRefSource := func(s *api.ImageSpec) (ref string, err error) {
147-
return s.IdeRef, nil
145+
// ide layer
146+
ideRefSource := func(s *api.ImageSpec) (ref []string, err error) {
147+
ref = append(ref, s.IdeRef, s.SupervisorRef)
148+
ref = append(ref, s.IdeLayerRef...)
149+
return ref, nil
148150
}
149151
ideLayerSource, err := NewSpecMappedImageSource(newResolver, ideRefSource)
150152
if err != nil {
151153
return nil, err
152154
}
153155
layerSources = append(layerSources, ideLayerSource)
154156

155-
// desktop IDE layer
156-
desktopIdeRefSource := func(s *api.ImageSpec) (ref string, err error) {
157-
return s.DesktopIdeRef, nil
158-
}
159-
desktopIdeLayerSource, err := NewSpecMappedImageSource(newResolver, desktopIdeRefSource)
160-
if err != nil {
161-
return nil, err
162-
}
163-
layerSources = append(layerSources, desktopIdeLayerSource)
164-
165-
// desktop IDE plugin layer
166-
desktopIdePluginRefSource := func(s *api.ImageSpec) (ref string, err error) {
167-
return s.GetDesktopIdePluginRef(), nil
168-
}
169-
desktopIdePluginLayerSource, err := NewSpecMappedImageSource(newResolver, desktopIdePluginRefSource)
170-
if err != nil {
171-
return nil, err
172-
}
173-
layerSources = append(layerSources, desktopIdePluginLayerSource)
174-
175-
// supervisor layer
176-
supervisorRefSource := func(s *api.ImageSpec) (ref string, err error) {
177-
return s.SupervisorRef, nil
178-
}
179-
supervisorLayerSource, err := NewSpecMappedImageSource(newResolver, supervisorRefSource)
180-
if err != nil {
181-
return nil, err
182-
}
183-
layerSources = append(layerSources, supervisorLayerSource)
184-
185157
// content layer
186158
clsrc, err := NewContentLayerSource()
187159
if err != nil {

0 commit comments

Comments
 (0)