@@ -24,7 +24,7 @@ import (
2424
2525 "github.com/containerd/containerd/v2/core/content"
2626 "github.com/containerd/containerd/v2/core/images"
27- "github.com/containerd/containerd/v2/core/images/converter"
27+ containerdConverter "github.com/containerd/containerd/v2/core/images/converter"
2828 "github.com/containerd/containerd/v2/pkg/archive"
2929 "github.com/containerd/containerd/v2/pkg/archive/compression"
3030 "github.com/containerd/containerd/v2/pkg/labels"
@@ -41,7 +41,6 @@ import (
4141
4242 "github.com/containerd/nydus-snapshotter/pkg/converter/tool"
4343 "github.com/containerd/nydus-snapshotter/pkg/label"
44- containerdReconverter "github.com/containerd/nydus-snapshotter/pkg/reconverter"
4544)
4645
4746const EntryBlob = "image.blob"
@@ -948,7 +947,7 @@ func makeOCIBlobDesc(ctx context.Context, cs content.Store, uncompressedDigest,
948947
949948// LayerConvertFunc returns a function which converts an OCI image layer to
950949// a nydus blob layer, and set the media type to "application/vnd.oci.image.layer.nydus.blob.v1".
951- func LayerConvertFunc (opt PackOption ) converter .ConvertFunc {
950+ func LayerConvertFunc (opt PackOption ) containerdConverter .ConvertFunc {
952951 return func (ctx context.Context , cs content.Store , desc ocispec.Descriptor ) (* ocispec.Descriptor , error ) {
953952 if ctx .Err () != nil {
954953 // The context is already cancelled, no need to proceed.
@@ -1059,7 +1058,7 @@ func LayerConvertFunc(opt PackOption) converter.ConvertFunc {
10591058// ConvertHookFunc returns a function which will be used as a callback
10601059// called for each blob after conversion is done. The function only hooks
10611060// the index conversion and the manifest conversion.
1062- func ConvertHookFunc (opt MergeOption ) converter .ConvertHookFunc {
1061+ func ConvertHookFunc (opt MergeOption ) containerdConverter .ConvertHookFunc {
10631062 return func (ctx context.Context , cs content.Store , orgDesc ocispec.Descriptor , newDesc * ocispec.Descriptor ) (* ocispec.Descriptor , error ) {
10641063 // If the previous conversion did not occur, the `newDesc` may be nil.
10651064 if newDesc == nil {
@@ -1198,148 +1197,6 @@ func convertManifest(ctx context.Context, cs content.Store, oldDesc ocispec.Desc
11981197 return newManifestDesc , nil
11991198}
12001199
1201- func ReconvertHookFunc () containerdReconverter.ConvertHookFunc {
1202- return func (ctx context.Context , cs content.Store , _ ocispec.Descriptor , newDesc * ocispec.Descriptor ) (* ocispec.Descriptor , error ) {
1203- desc := newDesc
1204- if ! images .IsManifestType (desc .MediaType ) {
1205- return desc , nil
1206- }
1207- if IsNydusBootstrap (* desc ) {
1208- return desc , nil
1209- }
1210- var err error
1211- var labels map [string ]string
1212- switch desc .MediaType {
1213- case ocispec .MediaTypeImageManifest , images .MediaTypeDockerSchema2Manifest :
1214- var manifest ocispec.Manifest
1215- labels , err = readJSON (ctx , cs , & manifest , * desc )
1216- if err != nil {
1217- return nil , errors .Wrap (err , "read manifest" )
1218- }
1219-
1220- desc , err = writeJSON (ctx , cs , manifest , * desc , labels )
1221- if err != nil {
1222- return nil , errors .Wrap (err , "write manifest" )
1223- }
1224- return desc , nil
1225-
1226- case ocispec .MediaTypeImageIndex , images .MediaTypeDockerSchema2ManifestList :
1227- var index ocispec.Index
1228- labels , err = readJSON (ctx , cs , & index , * desc )
1229- if err != nil {
1230- return nil , errors .Wrap (err , "read manifest index" )
1231- }
1232- for idx , maniDesc := range index .Manifests {
1233- var manifest ocispec.Manifest
1234- labels , err = readJSON (ctx , cs , & manifest , maniDesc )
1235- if err != nil {
1236- return nil , errors .Wrap (err , "read manifest" )
1237- }
1238-
1239- newManiDesc , err := writeJSON (ctx , cs , manifest , maniDesc , labels )
1240- if err != nil {
1241- return nil , errors .Wrap (err , "write manifest" )
1242- }
1243- index .Manifests [idx ] = * newManiDesc
1244- }
1245- desc , err = writeJSON (ctx , cs , index , * desc , labels )
1246- if err != nil {
1247- return nil , errors .Wrap (err , "write manifest index" )
1248- }
1249-
1250- return desc , nil
1251-
1252- default :
1253- return nil , errors .Errorf ("unsupported media type %s" , desc .MediaType )
1254- }
1255- }
1256- }
1257-
1258- func LayerReconvertFunc (opt UnpackOption ) containerdReconverter.ConvertFunc {
1259- return func (ctx context.Context , cs content.Store , desc ocispec.Descriptor ) (* ocispec.Descriptor , error ) {
1260- if ! images .IsLayerType (desc .MediaType ) {
1261- return nil , nil
1262- }
1263-
1264- // Skip the nydus bootstrap layer.
1265- if IsNydusBootstrap (desc ) {
1266- logrus .Debugf ("skip nydus bootstrap layer %s" , desc .Digest .String ())
1267- return & desc , nil
1268- }
1269-
1270- ra , err := cs .ReaderAt (ctx , desc )
1271- if err != nil {
1272- return nil , errors .Wrap (err , "get reader" )
1273- }
1274- defer ra .Close ()
1275-
1276- ref := fmt .Sprintf ("convert-oci-from-%s" , desc .Digest )
1277- cw , err := content .OpenWriter (ctx , cs , content .WithRef (ref ))
1278- if err != nil {
1279- return nil , errors .Wrap (err , "open blob writer" )
1280- }
1281-
1282- var gw io.WriteCloser
1283- var mediaType string
1284- switch opt .Compressor {
1285- case "gzip" :
1286- gw = gzip .NewWriter (cw )
1287- mediaType = ocispec .MediaTypeImageLayerGzip
1288- default :
1289- gw , err = zstd .NewWriter (cw )
1290- if err != nil {
1291- return nil , errors .Wrap (err , "create zstd writer" )
1292- }
1293- mediaType = ocispec .MediaTypeImageLayerZstd
1294- }
1295- var data bytes.Buffer
1296- writer := io .Writer (& data )
1297- uncompressedDgster := digest .SHA256 .Digester ()
1298-
1299- err = Unpack (ctx , ra , writer , opt )
1300- if err != nil {
1301- return nil , errors .Wrap (err , "unpack nydus to tar" )
1302- }
1303-
1304- compressed := io .MultiWriter (gw , uncompressedDgster .Hash ())
1305- // _, err = uncompressedDgster.Hash().Write(data.Bytes())
1306-
1307- buffer := bufPool .Get ().(* []byte )
1308- defer bufPool .Put (buffer )
1309- if _ , err = io .CopyBuffer (compressed , bytes .NewReader (data .Bytes ()), * buffer ); err != nil {
1310- return nil , errors .Wrapf (err , "copy bootstrap targz into content store" )
1311- }
1312- if err = gw .Close (); err != nil {
1313- return nil , errors .Wrap (err , "close gzip writer" )
1314- }
1315-
1316- uncompressedDigest := uncompressedDgster .Digest ()
1317- compressedDgst := cw .Digest ()
1318- if err = cw .Commit (ctx , 0 , compressedDgst , content .WithLabels (map [string ]string {
1319- LayerAnnotationUncompressed : uncompressedDigest .String (),
1320- })); err != nil {
1321- if ! errdefs .IsAlreadyExists (err ) {
1322- return nil , errors .Wrap (err , "commit to content store" )
1323- }
1324- }
1325- if err = cw .Close (); err != nil {
1326- return nil , errors .Wrap (err , "close content store writer" )
1327- }
1328-
1329- newDesc , err := makeOCIBlobDesc (ctx , cs , uncompressedDigest , compressedDgst , mediaType )
1330- if err != nil {
1331- return nil , err
1332- }
1333-
1334- if opt .Backend != nil {
1335- if err := opt .Backend .Push (ctx , cs , * newDesc ); err != nil {
1336- return nil , errors .Wrap (err , "push to storage backend" )
1337- }
1338- }
1339- return newDesc , nil
1340- }
1341- }
1342-
13431200// MergeLayers merges a list of nydus blob layer into a nydus bootstrap layer.
13441201// The media type of the nydus bootstrap layer is "application/vnd.oci.image.layer.v1.tar+gzip".
13451202func MergeLayers (ctx context.Context , cs content.Store , descs []ocispec.Descriptor , opt MergeOption ) (* ocispec.Descriptor , []ocispec.Descriptor , error ) {
0 commit comments