@@ -80,24 +80,16 @@ func (l *Layer) uncompressedTarCache(uncompressedLayersCacheDir string) (string,
80
80
81
81
// Read parses information from the underlying layer tar into this struct. This includes layer metadata, the layer
82
82
// file tree, and the layer squash tree.
83
- func (l * Layer ) Read (catalog * FileCatalog , imgMetadata Metadata , idx int , uncompressedLayersCacheDir string ) error {
84
- var err error
85
- tree := filetree .New ()
86
- l .Tree = tree
87
- l .fileCatalog = catalog
88
- l .Metadata , err = newLayerMetadata (imgMetadata , l .layer , idx )
83
+ func (l * Layer ) Read (catalog * FileCatalog , idx int , uncompressedLayersCacheDir string ) error {
84
+ mediaType , err := l .layer .MediaType ()
89
85
if err != nil {
90
86
return err
91
87
}
88
+ tree := filetree .New ()
89
+ l .Tree = tree
90
+ l .fileCatalog = catalog
92
91
93
- log .Debugf ("layer metadata: index=%+v digest=%+v mediaType=%+v" ,
94
- l .Metadata .Index ,
95
- l .Metadata .Digest ,
96
- l .Metadata .MediaType )
97
-
98
- monitor := trackReadProgress (l .Metadata )
99
-
100
- switch l .Metadata .MediaType {
92
+ switch mediaType {
101
93
case types .OCILayer ,
102
94
types .OCIUncompressedLayer ,
103
95
types .OCIRestrictedLayer ,
@@ -107,44 +99,84 @@ func (l *Layer) Read(catalog *FileCatalog, imgMetadata Metadata, idx int, uncomp
107
99
types .DockerForeignLayer ,
108
100
types .DockerUncompressedLayer :
109
101
110
- tarFilePath , err := l .uncompressedTarCache ( uncompressedLayersCacheDir )
102
+ err := l .readStandardImageLayer ( idx , uncompressedLayersCacheDir , tree )
111
103
if err != nil {
112
104
return err
113
105
}
114
-
115
- l .indexedContent , err = file .NewTarIndex (
116
- tarFilePath ,
117
- layerTarIndexer (tree , l .fileCatalog , & l .Metadata .Size , l , monitor ),
118
- )
119
- if err != nil {
120
- return fmt .Errorf ("failed to read layer=%q tar : %w" , l .Metadata .Digest , err )
121
- }
122
-
123
106
case SingularitySquashFSLayer :
124
- r , err := l .layer .Uncompressed ()
125
- if err != nil {
126
- return fmt .Errorf ("failed to read layer=%q: %w" , l .Metadata .Digest , err )
127
- }
128
- // defer r.Close() // TODO: if we close this here, we can't read file contents after we return.
129
-
130
- // Walk the more efficient walk if we're blessed with an io.ReaderAt.
131
- if ra , ok := r .(io.ReaderAt ); ok {
132
- err = file .WalkSquashFS (ra , squashfsVisitor (tree , l .fileCatalog , & l .Metadata .Size , l , monitor ))
133
- } else {
134
- err = file .WalkSquashFSFromReader (r , squashfsVisitor (tree , l .fileCatalog , & l .Metadata .Size , l , monitor ))
135
- }
107
+ err := l .readSingularityImageLayer (idx , tree )
136
108
if err != nil {
137
- return fmt . Errorf ( "failed to walk layer=%q: %w" , l . Metadata . Digest , err )
109
+ return err
138
110
}
139
-
140
111
default :
141
- return fmt .Errorf ("unknown layer media type: %+v" , l . Metadata . MediaType )
112
+ return fmt .Errorf ("unknown layer media type: %+v" , mediaType )
142
113
}
143
114
144
115
l .SearchContext = filetree .NewSearchContext (l .Tree , l .fileCatalog .Index )
145
116
117
+ return nil
118
+ }
119
+
120
+ func (l * Layer ) readStandardImageLayer (idx int , uncompressedLayersCacheDir string , tree * filetree.FileTree ) error {
121
+ var err error
122
+ l .Metadata , err = newLayerMetadata (l .layer , idx )
123
+ monitor := trackReadProgress (l .Metadata )
124
+ if err != nil {
125
+ return err
126
+ }
127
+
128
+ log .Debugf ("layer metadata: index=%+v digest=%+v mediaType=%+v" ,
129
+ l .Metadata .Index ,
130
+ l .Metadata .Digest ,
131
+ l .Metadata .MediaType )
132
+
133
+ tarFilePath , err := l .uncompressedTarCache (uncompressedLayersCacheDir )
134
+ if err != nil {
135
+ return err
136
+ }
137
+
138
+ l .indexedContent , err = file .NewTarIndex (
139
+ tarFilePath ,
140
+ layerTarIndexer (tree , l .fileCatalog , & l .Metadata .Size , l , monitor ),
141
+ )
142
+ if err != nil {
143
+ return fmt .Errorf ("failed to read layer=%q tar : %w" , l .Metadata .Digest , err )
144
+ }
145
+
146
146
monitor .SetCompleted ()
147
+ return nil
148
+ }
147
149
150
+ func (l * Layer ) readSingularityImageLayer (idx int , tree * filetree.FileTree ) error {
151
+ var err error
152
+ l .Metadata , err = newLayerMetadata (l .layer , idx )
153
+ if err != nil {
154
+ return err
155
+ }
156
+
157
+ log .Debugf ("layer metadata: index=%+v digest=%+v mediaType=%+v" ,
158
+ l .Metadata .Index ,
159
+ l .Metadata .Digest ,
160
+ l .Metadata .MediaType )
161
+
162
+ monitor := trackReadProgress (l .Metadata )
163
+ r , err := l .layer .Uncompressed ()
164
+ if err != nil {
165
+ return fmt .Errorf ("failed to read layer=%q: %w" , l .Metadata .Digest , err )
166
+ }
167
+ // defer r.Close() // TODO: if we close this here, we can't read file contents after we return.
168
+
169
+ // Walk the more efficient walk if we're blessed with an io.ReaderAt.
170
+ if ra , ok := r .(io.ReaderAt ); ok {
171
+ err = file .WalkSquashFS (ra , squashfsVisitor (tree , l .fileCatalog , & l .Metadata .Size , l , monitor ))
172
+ } else {
173
+ err = file .WalkSquashFSFromReader (r , squashfsVisitor (tree , l .fileCatalog , & l .Metadata .Size , l , monitor ))
174
+ }
175
+ if err != nil {
176
+ return fmt .Errorf ("failed to walk layer=%q: %w" , l .Metadata .Digest , err )
177
+ }
178
+
179
+ monitor .SetCompleted ()
148
180
return nil
149
181
}
150
182
0 commit comments