@@ -38,6 +38,7 @@ import (
3838 "github.com/GoogleContainerTools/container-diff/util"
3939 "github.com/google/go-containerregistry/pkg/v1"
4040 homedir "github.com/mitchellh/go-homedir"
41+ "github.com/pkg/errors"
4142 "github.com/sirupsen/logrus"
4243 "github.com/spf13/cobra"
4344 "github.com/spf13/pflag"
@@ -131,6 +132,9 @@ func checkIfValidAnalyzer(_ []string) error {
131132 return nil
132133}
133134
135+ // getImageForName infers the source of an image and retrieves a v1.Image reference to it.
136+ // Once a reference is obtained, it attempts to unpack the v1.Image's reader's contents
137+ // into a temp directory on the local filesystem.
134138func getImageForName (imageName string ) (pkgutil.Image , error ) {
135139 logrus .Infof ("retrieving image: %s" , imageName )
136140 var img v1.Image
@@ -139,17 +143,17 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
139143 start := time .Now ()
140144 img , err = tarball .ImageFromPath (imageName , nil )
141145 if err != nil {
142- return pkgutil.Image {}, err
146+ return pkgutil.Image {}, errors . Wrap ( err , "retrieving tar from path" )
143147 }
144148 elapsed := time .Now ().Sub (start )
145- logrus .Infof ("retrieving image from tar took %f seconds" , elapsed .Seconds ())
149+ logrus .Infof ("retrieving image ref from tar took %f seconds" , elapsed .Seconds ())
146150 } else if strings .HasPrefix (imageName , DaemonPrefix ) {
147151 // remove the daemon prefix
148152 imageName = strings .Replace (imageName , DaemonPrefix , "" , - 1 )
149153
150154 ref , err := name .ParseReference (imageName , name .WeakValidation )
151155 if err != nil {
152- return pkgutil.Image {}, err
156+ return pkgutil.Image {}, errors . Wrap ( err , "parsing image reference" )
153157 }
154158
155159 start := time .Now ()
@@ -158,28 +162,28 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
158162 Buffer : true ,
159163 })
160164 if err != nil {
161- return pkgutil.Image {}, err
165+ return pkgutil.Image {}, errors . Wrap ( err , "retrieving image from daemon" )
162166 }
163167 elapsed := time .Now ().Sub (start )
164- logrus .Infof ("retrieving image from daemon took %f seconds" , elapsed .Seconds ())
168+ logrus .Infof ("retrieving local image ref took %f seconds" , elapsed .Seconds ())
165169 } else {
166170 // either has remote prefix or has no prefix, in which case we force remote
167171 imageName = strings .Replace (imageName , RemotePrefix , "" , - 1 )
168172 ref , err := name .ParseReference (imageName , name .WeakValidation )
169173 if err != nil {
170- return pkgutil.Image {}, err
174+ return pkgutil.Image {}, errors . Wrap ( err , "parsing image reference" )
171175 }
172176 auth , err := authn .DefaultKeychain .Resolve (ref .Context ().Registry )
173177 if err != nil {
174- return pkgutil.Image {}, err
178+ return pkgutil.Image {}, errors . Wrap ( err , "resolving auth" )
175179 }
176180 start := time .Now ()
177181 img , err = remote .Image (ref , auth , http .DefaultTransport )
178182 if err != nil {
179- return pkgutil.Image {}, err
183+ return pkgutil.Image {}, errors . Wrap ( err , "retrieving remote image" )
180184 }
181185 elapsed := time .Now ().Sub (start )
182- logrus .Infof ("retrieving remote image took %f seconds" , elapsed .Seconds ())
186+ logrus .Infof ("retrieving remote image ref took %f seconds" , elapsed .Seconds ())
183187 }
184188
185189 // create tempdir and extract fs into it
@@ -188,7 +192,7 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
188192 start := time .Now ()
189193 imgLayers , err := img .Layers ()
190194 if err != nil {
191- return pkgutil.Image {}, err
195+ return pkgutil.Image {}, errors . Wrap ( err , "getting image layers" )
192196 }
193197 for _ , layer := range imgLayers {
194198 layerStart := time .Now ()
@@ -197,12 +201,12 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
197201 if err != nil {
198202 return pkgutil.Image {
199203 Layers : layers ,
200- }, err
204+ }, errors . Wrap ( err , "getting extract path for layer" )
201205 }
202206 if err := pkgutil .GetFileSystemForLayer (layer , path , nil ); err != nil {
203207 return pkgutil.Image {
204208 Layers : layers ,
205- }, err
209+ }, errors . Wrap ( err , "getting filesystem for layer" )
206210 }
207211 layers = append (layers , pkgutil.Layer {
208212 FSPath : path ,
@@ -215,12 +219,15 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
215219 }
216220
217221 path , err := getExtractPathForImage (imageName , img )
222+ if err != nil {
223+ return pkgutil.Image {}, err
224+ }
218225 // extract fs into provided dir
219226 if err := pkgutil .GetFileSystemForImage (img , path , nil ); err != nil {
220227 return pkgutil.Image {
221228 FSPath : path ,
222229 Layers : layers ,
223- }, err
230+ }, errors . Wrap ( err , "getting filesystem for image" )
224231 }
225232 return pkgutil.Image {
226233 Image : img ,
0 commit comments