Skip to content

Commit

Permalink
Whenever processing OCI Platform data, include OSVersion and OSFeatures
Browse files Browse the repository at this point in the history
Trivially created by looking for every reference to .Variant and adding
OSVersion and OSFeatures.

Signed-off-by: Paul "TBBle" Hampson <[email protected]>
  • Loading branch information
TBBle committed Nov 2, 2023
1 parent 36c5550 commit 20f2fe1
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 22 deletions.
2 changes: 2 additions & 0 deletions client/llb/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,8 @@ func (s State) WithImageConfig(c []byte) (State, error) {
OS: img.OS,
Architecture: img.Architecture,
Variant: img.Variant,
OSVersion: img.OSVersion,
OSFeatures: img.OSFeatures,
})
}
return s, nil
Expand Down
2 changes: 2 additions & 0 deletions exporter/containerimage/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,8 @@ func defaultImageConfig() ([]byte, error) {
img := ocispecs.Image{}
img.Architecture = pl.Architecture
img.OS = pl.OS
img.OSVersion = pl.OSVersion
img.OSFeatures = pl.OSFeatures
img.Variant = pl.Variant
img.RootFS.Type = "layers"
img.Config.WorkingDir = "/"
Expand Down
4 changes: 4 additions & 0 deletions frontend/dockerfile/dockerfile2llb/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,8 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
OS: img.OS,
Architecture: img.Architecture,
Variant: img.Variant,
OSVersion: img.OSVersion,
OSFeatures: img.OSFeatures,
}
}
}
Expand Down Expand Up @@ -595,6 +597,8 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
target.image.OS = platformOpt.targetPlatform.OS
target.image.Architecture = platformOpt.targetPlatform.Architecture
target.image.Variant = platformOpt.targetPlatform.Variant
target.image.OSVersion = platformOpt.targetPlatform.OSVersion
target.image.OSFeatures = platformOpt.targetPlatform.OSFeatures
}

return target, nil
Expand Down
2 changes: 2 additions & 0 deletions frontend/dockerfile/dockerfile2llb/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ func emptyImage(platform ocispecs.Platform) image.Image {
img := image.Image{}
img.Architecture = platform.Architecture
img.OS = platform.OS
img.OSVersion = platform.OSVersion
img.OSFeatures = platform.OSFeatures
img.Variant = platform.Variant
img.RootFS.Type = "layers"
img.Config.WorkingDir = "/"
Expand Down
26 changes: 16 additions & 10 deletions solver/llbsolver/ops/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ func (e *ExecOp) CacheMap(ctx context.Context, g session.Group, index int) (*sol
OS: e.platform.OS,
Architecture: e.platform.Architecture,
Variant: e.platform.Variant,
OSVersion: e.platform.OSVersion,
OSFeatures: e.platform.OSFeatures,
}
}

Expand All @@ -133,17 +135,21 @@ func (e *ExecOp) CacheMap(ctx context.Context, g session.Group, index int) (*sol
}

dt, err := json.Marshal(struct {
Type string
Exec *pb.ExecOp
OS string
Arch string
Variant string `json:",omitempty"`
Type string
Exec *pb.ExecOp
OS string
Arch string
Variant string `json:",omitempty"`
OSVersion string `json:",omitempty"`
OSFeatures []string `json:",omitempty"`
}{
Type: execCacheType,
Exec: &op,
OS: p.OS,
Arch: p.Architecture,
Variant: p.Variant,
Type: execCacheType,
Exec: &op,
OS: p.OS,
Arch: p.Architecture,
Variant: p.Variant,
OSVersion: p.OSVersion,
OSFeatures: p.OSFeatures,
})
if err != nil {
return nil, false, err
Expand Down
2 changes: 2 additions & 0 deletions solver/llbsolver/ops/exec_binfmt.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ func getEmulator(ctx context.Context, p *pb.Platform, idmap *idtools.IdentityMap
pp := platforms.Normalize(ocispecs.Platform{
Architecture: p.Architecture,
OS: p.OS,
OSVersion: p.OSVersion,
OSFeatures: p.OSFeatures,
Variant: p.Variant,
})

Expand Down
4 changes: 3 additions & 1 deletion solver/llbsolver/provenance/capture.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ func (c *Capture) AddImage(i ImageSource) {
return
}
if v.Platform != nil && i.Platform != nil {
if v.Platform.Architecture == i.Platform.Architecture && v.Platform.OS == i.Platform.OS && v.Platform.Variant == i.Platform.Variant {
// NOTE: Deliberately excluding OSFeatures, as there's no extant (or rational) case where a source image is an index and contains images distinguished only by OSFeature
// See https://github.com/moby/buildkit/pull/4387#discussion_r1376234241
if v.Platform.Architecture == i.Platform.Architecture && v.Platform.OS == i.Platform.OS && v.Platform.OSVersion == i.Platform.OSVersion && v.Platform.Variant == i.Platform.Variant {
return
}
}
Expand Down
12 changes: 11 additions & 1 deletion solver/llbsolver/vertex.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,17 +79,27 @@ func NormalizeRuntimePlatforms() LoadOpt {
OS: p.OS,
Architecture: p.Architecture,
Variant: p.Variant,
OSVersion: p.OSVersion,
OSFeatures: p.OSFeatures,
}
}
op.Platform = defaultPlatform
}
platform := ocispecs.Platform{OS: op.Platform.OS, Architecture: op.Platform.Architecture, Variant: op.Platform.Variant}
platform := ocispecs.Platform{
OS: op.Platform.OS,
Architecture: op.Platform.Architecture,
Variant: op.Platform.Variant,
OSVersion: op.Platform.OSVersion,
OSFeatures: op.Platform.OSFeatures,
}
normalizedPlatform := platforms.Normalize(platform)

op.Platform = &pb.Platform{
OS: normalizedPlatform.OS,
Architecture: normalizedPlatform.Architecture,
Variant: normalizedPlatform.Variant,
OSVersion: normalizedPlatform.OSVersion,
OSFeatures: normalizedPlatform.OSFeatures,
}

return nil
Expand Down
24 changes: 14 additions & 10 deletions source/containerimage/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,21 @@ type puller struct {

func mainManifestKey(ctx context.Context, desc ocispecs.Descriptor, platform ocispecs.Platform, layerLimit *int) (digest.Digest, error) {
dt, err := json.Marshal(struct {
Digest digest.Digest
OS string
Arch string
Variant string `json:",omitempty"`
Limit *int `json:",omitempty"`
Digest digest.Digest
OS string
Arch string
Variant string `json:",omitempty"`
OSVersion string `json:",omitempty"`
OSFeatures []string `json:",omitempty"`
Limit *int `json:",omitempty"`
}{
Digest: desc.Digest,
OS: platform.OS,
Arch: platform.Architecture,
Variant: platform.Variant,
Limit: layerLimit,
Digest: desc.Digest,
OS: platform.OS,
Arch: platform.Architecture,
Variant: platform.Variant,
OSVersion: platform.OSVersion,
OSFeatures: platform.OSFeatures,
Limit: layerLimit,
})
if err != nil {
return "", err
Expand Down

0 comments on commit 20f2fe1

Please sign in to comment.