@@ -963,12 +963,12 @@ func layerDiff(t *testing.T, image1, image2 string) {
963963 t .Helper ()
964964 layers1 , err := getImageLayers (image1 )
965965 if err != nil {
966- t .Fatalf ("Couldn't get details from image reference for (%s): %s" , image1 , err )
966+ t .Fatalf ("Couldn't get layers from image reference for (%s): %s" , image1 , err )
967967 }
968968
969969 layers2 , err := getImageLayers (image2 )
970970 if err != nil {
971- t .Fatalf ("Couldn't get details from image reference for (%s): %s" , image2 , err )
971+ t .Fatalf ("Couldn't get layers from image reference for (%s): %s" , image2 , err )
972972 }
973973
974974 for idx := range min (len (layers1 ), len (layers2 )) {
@@ -983,12 +983,29 @@ func layerDiff(t *testing.T, image1, image2 string) {
983983 }
984984
985985 if l1d != l2d {
986- t .Errorf ("Image Layers #%d differ %s != %s" , idx , l1d , l2d )
986+ command , err := resolveCreatedBy (image1 , idx )
987+ if err != nil {
988+ t .Errorf ("Image Layers #%d differ" , idx )
989+ } else {
990+ t .Errorf ("Image Layers #%d differ: %s" , idx , command )
991+ }
987992 }
988993 }
989994
990- if len (layers1 ) != len (layers2 ) {
991- t .Errorf ("Image Layer count differs %d != %d" , len (layers1 ), len (layers2 ))
995+ if len (layers1 ) > len (layers2 ) {
996+ command , err := resolveCreatedBy (image1 , len (layers2 ))
997+ if err != nil {
998+ t .Errorf ("Image Layer count differs %d != %d" , len (layers1 ), len (layers2 ))
999+ } else {
1000+ t .Errorf ("Image Layer count differs %d != %d: %s" , len (layers1 ), len (layers2 ), command )
1001+ }
1002+ } else if len (layers1 ) < len (layers2 ) {
1003+ command , err := resolveCreatedBy (image2 , len (layers1 ))
1004+ if err != nil {
1005+ t .Errorf ("Image Layer count differs %d != %d" , len (layers1 ), len (layers2 ))
1006+ } else {
1007+ t .Errorf ("Image Layer count differs %d != %d: %s" , len (layers1 ), len (layers2 ), command )
1008+ }
9921009 }
9931010}
9941011
@@ -1010,6 +1027,32 @@ func checkLayers(t *testing.T, image1, image2 string, offset int) {
10101027 }
10111028}
10121029
1030+ func resolveCreatedBy (image string , layerIndex int ) (string , error ) {
1031+ ref , err := name .ParseReference (image , name .WeakValidation )
1032+ if err != nil {
1033+ return "" , fmt .Errorf ("Couldn't parse referance to image %s: %w" , image , err )
1034+ }
1035+ imgRef , err := daemon .Image (ref )
1036+ if err != nil {
1037+ return "" , fmt .Errorf ("Couldn't get reference to image %s from daemon: %w" , image , err )
1038+ }
1039+ cfg , err := imgRef .ConfigFile ()
1040+ if err != nil {
1041+ return "" , fmt .Errorf ("Couldn't get Config for image %s: %w" , image , err )
1042+ }
1043+ idx := 0
1044+ for _ , history := range cfg .History {
1045+ if history .EmptyLayer {
1046+ continue
1047+ }
1048+ if idx == layerIndex {
1049+ return history .CreatedBy , nil
1050+ }
1051+ idx ++
1052+ }
1053+ return "" , fmt .Errorf ("LayerIndex %d not found in History of length %d" , layerIndex , len (cfg .History ))
1054+ }
1055+
10131056func getImageLayers (image string ) ([]v1.Layer , error ) {
10141057 ref , err := name .ParseReference (image , name .WeakValidation )
10151058 if err != nil {
0 commit comments