@@ -47,7 +47,6 @@ func (b *BundleReader) GetBundle(image, outputDir string) error {
47
47
}
48
48
defer os .RemoveAll (workingDir )
49
49
50
- //TODO: Use filepath package here
51
50
rootTarfile := filepath .Join (workingDir , "bundle.tar" )
52
51
53
52
err = r .Save (image , rootTarfile )
@@ -62,34 +61,35 @@ func (b *BundleReader) GetBundle(image, outputDir string) error {
62
61
defer f .Close ()
63
62
64
63
// Read the manifest.json file to find the right embedded tarball
65
- layerTarball , err := getManifestLayer (tar .NewReader (f ))
64
+ layerTarballs , err := getManifestLayers (tar .NewReader (f ))
66
65
if err != nil {
67
66
return err
68
67
}
68
+ // Untar theimage layer tarballs and push the bundle manifests to the output directory
69
+ for _ , tarball := range layerTarballs {
70
+ f , err = os .Open (rootTarfile )
71
+ if err != nil {
72
+ return err
73
+ }
74
+ defer f .Close ()
69
75
70
- f , err = os .Open (rootTarfile )
71
- if err != nil {
72
- return err
73
- }
74
- defer f .Close ()
75
-
76
- // Untar the top image layer tarball and push the bundle manifests to the output directory
77
- err = extractBundleManifests (layerTarball , outputDir , tar .NewReader (f ))
78
- if err != nil {
79
- return err
76
+ err = extractBundleManifests (tarball , outputDir , tar .NewReader (f ))
77
+ if err != nil {
78
+ return err
79
+ }
80
80
}
81
81
82
82
return nil
83
83
}
84
84
85
- func getManifestLayer (tarReader * tar.Reader ) (string , error ) {
85
+ func getManifestLayers (tarReader * tar.Reader ) ([] string , error ) {
86
86
for {
87
87
header , err := tarReader .Next ()
88
88
if err != nil {
89
89
if err == io .EOF {
90
- return "" , fmt .Errorf ("invalid bundle image: unable to find manifest.json" )
90
+ return nil , fmt .Errorf ("invalid bundle image: unable to find manifest.json" )
91
91
}
92
- return "" , err
92
+ return nil , err
93
93
}
94
94
95
95
if header .Name == imageManifestName {
@@ -100,20 +100,20 @@ func getManifestLayer(tarReader *tar.Reader) (string, error) {
100
100
manifests := make ([]imageManifest , 0 )
101
101
err := json .Unmarshal (b , & manifests )
102
102
if err != nil {
103
- return "" , err
103
+ return nil , err
104
104
}
105
105
106
106
if len (manifests ) == 0 {
107
- return "" , fmt .Errorf ("invalid bundle image: manifest.json missing manifest data" )
107
+ return nil , fmt .Errorf ("invalid bundle image: manifest.json missing manifest data" )
108
108
}
109
109
110
110
topManifest := manifests [0 ]
111
111
112
112
if len (topManifest .Layers ) == 0 {
113
- return "" , fmt .Errorf ("invalid bundle image: manifest has no layers" )
113
+ return nil , fmt .Errorf ("invalid bundle image: manifest has no layers" )
114
114
}
115
115
116
- return topManifest .Layers [ 0 ] , nil
116
+ return topManifest .Layers , nil
117
117
}
118
118
}
119
119
}
0 commit comments