github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/pkg/image/imageprobe.go (about) 1 // Copyright © 2021 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package image 16 17 import ( 18 "fmt" 19 20 "github.com/opencontainers/go-digest" 21 22 "github.com/alibaba/sealer/logger" 23 "github.com/alibaba/sealer/pkg/image/cache" 24 ) 25 26 type Prober interface { 27 Reset() 28 Probe(parentID string, layer *cache.Layer) (cacheID digest.Digest, err error) 29 } 30 31 type imageProber struct { 32 cache Cache 33 reset func() Cache 34 cacheBusted bool 35 } 36 37 func NewImageProber(cacheBuilder CacheBuilder, noCache bool) Prober { 38 if noCache { 39 return &nopProber{} 40 } 41 42 reset := func() Cache { 43 c, err := cacheBuilder.BuildImageCache() 44 if err != nil { 45 logger.Info("failed to init image cache, err: %s", err) 46 return &cache.NopImageCache{} 47 } 48 return c 49 } 50 51 return &imageProber{cache: reset(), reset: reset} 52 } 53 54 func (c *imageProber) Reset() { 55 c.cache = c.reset() 56 c.cacheBusted = false 57 } 58 59 func (c *imageProber) Probe(parentID string, layer *cache.Layer) (cacheID digest.Digest, err error) { 60 if c.cacheBusted { 61 return "", nil 62 } 63 64 cacheID, err = c.cache.GetCache(parentID, layer) 65 if err != nil { 66 return "", err 67 } 68 69 return cacheID, nil 70 } 71 72 type nopProber struct{} 73 74 func (c *nopProber) Reset() {} 75 76 func (c *nopProber) Probe(_ string, _ *cache.Layer) (digest.Digest, error) { 77 return "", fmt.Errorf("nop prober") 78 }