forked from buildpacks/lifecycle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
analyzer.go
85 lines (72 loc) · 2.17 KB
/
analyzer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package lifecycle
import (
"github.com/buildpacks/imgutil"
"github.com/pkg/errors"
"github.com/buildpacks/lifecycle/api"
"github.com/buildpacks/lifecycle/buildpack"
"github.com/buildpacks/lifecycle/platform"
)
type Platform interface {
API() string
}
type Analyzer struct {
Image imgutil.Image
Logger Logger
Platform Platform
// Platform API < 0.7
Buildpacks []buildpack.GroupBuildpack
Cache Cache
LayerMetadataRestorer LayerMetadataRestorer
}
// Analyze fetches the layers metadata from the previous image and writes analyzed.toml.
func (a *Analyzer) Analyze() (platform.AnalyzedMetadata, error) {
var (
appMeta platform.LayersMetadata
cacheMeta platform.CacheMetadata
imageID *platform.ImageIdentifier
err error
)
if a.Image != nil { // Image is optional in Platform API >= 0.7
imageID, err = a.getImageIdentifier(a.Image)
if err != nil {
return platform.AnalyzedMetadata{}, errors.Wrap(err, "retrieving image identifier")
}
// continue even if the label cannot be decoded
if err := DecodeLabel(a.Image, platform.LayerMetadataLabel, &appMeta); err != nil {
appMeta = platform.LayersMetadata{}
}
} else {
appMeta = platform.LayersMetadata{}
}
if a.restoresLayerMetadata() {
cacheMeta, err = retrieveCacheMetadata(a.Cache, a.Logger)
if err != nil {
return platform.AnalyzedMetadata{}, err
}
useShaFiles := true
if err := a.LayerMetadataRestorer.Restore(a.Buildpacks, appMeta, cacheMeta, NewLayerSHAStore(useShaFiles)); err != nil {
return platform.AnalyzedMetadata{}, err
}
}
return platform.AnalyzedMetadata{
Image: imageID,
Metadata: appMeta,
}, nil
}
func (a *Analyzer) restoresLayerMetadata() bool {
return api.MustParse(a.Platform.API()).LessThan("0.7")
}
func (a *Analyzer) getImageIdentifier(image imgutil.Image) (*platform.ImageIdentifier, error) {
if !image.Found() {
a.Logger.Infof("Previous image with name %q not found", image.Name())
return nil, nil
}
identifier, err := image.Identifier()
if err != nil {
return nil, err
}
a.Logger.Debugf("Analyzing image %q", identifier.String())
return &platform.ImageIdentifier{
Reference: identifier.String(),
}, nil
}