writeContentsForImage will commit oci image config and manifest into containerd's content store.
(ctx context.Context, snName string, baseImg containerd.Image, newConfig ocispec.Image, diffLayerDesc ocispec.Descriptor, opts *Opts)
| 298 | |
| 299 | // writeContentsForImage will commit oci image config and manifest into containerd's content store. |
| 300 | func writeContentsForImage(ctx context.Context, snName string, baseImg containerd.Image, newConfig ocispec.Image, diffLayerDesc ocispec.Descriptor, opts *Opts) (ocispec.Descriptor, digest.Digest, error) { |
| 301 | newConfigJSON, err := json.Marshal(newConfig) |
| 302 | if err != nil { |
| 303 | return ocispec.Descriptor{}, emptyDigest, err |
| 304 | } |
| 305 | |
| 306 | // Select media types based on format choice |
| 307 | var configMediaType, manifestMediaType string |
| 308 | switch opts.Format { |
| 309 | case types.ImageFormatOCI: |
| 310 | configMediaType = ocispec.MediaTypeImageConfig |
| 311 | manifestMediaType = ocispec.MediaTypeImageManifest |
| 312 | case types.ImageFormatDocker: |
| 313 | configMediaType = images.MediaTypeDockerSchema2Config |
| 314 | manifestMediaType = images.MediaTypeDockerSchema2Manifest |
| 315 | default: |
| 316 | // Default to Docker Schema2 for compatibility |
| 317 | configMediaType = images.MediaTypeDockerSchema2Config |
| 318 | manifestMediaType = images.MediaTypeDockerSchema2Manifest |
| 319 | } |
| 320 | |
| 321 | configDesc := ocispec.Descriptor{ |
| 322 | MediaType: configMediaType, |
| 323 | Digest: digest.FromBytes(newConfigJSON), |
| 324 | Size: int64(len(newConfigJSON)), |
| 325 | } |
| 326 | |
| 327 | cs := baseImg.ContentStore() |
| 328 | baseMfst, _, err := imgutil.ReadManifest(ctx, baseImg) |
| 329 | if err != nil { |
| 330 | return ocispec.Descriptor{}, emptyDigest, err |
| 331 | } |
| 332 | layers := append(baseMfst.Layers, diffLayerDesc) |
| 333 | |
| 334 | newMfst := struct { |
| 335 | MediaType string `json:"mediaType,omitempty"` |
| 336 | ocispec.Manifest |
| 337 | }{ |
| 338 | MediaType: manifestMediaType, |
| 339 | Manifest: ocispec.Manifest{ |
| 340 | Versioned: specs.Versioned{ |
| 341 | SchemaVersion: 2, |
| 342 | }, |
| 343 | Config: configDesc, |
| 344 | Layers: layers, |
| 345 | }, |
| 346 | } |
| 347 | |
| 348 | newMfstJSON, err := json.MarshalIndent(newMfst, "", " ") |
| 349 | if err != nil { |
| 350 | return ocispec.Descriptor{}, emptyDigest, err |
| 351 | } |
| 352 | |
| 353 | newMfstDesc := ocispec.Descriptor{ |
| 354 | MediaType: manifestMediaType, |
| 355 | Digest: digest.FromBytes(newMfstJSON), |
| 356 | Size: int64(len(newMfstJSON)), |
| 357 | } |
no test coverage detected
searching dependent graphs…