github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/source/image_metadata.go (about) 1 package source 2 3 import "github.com/anchore/stereoscope/pkg/image" 4 5 // ImageMetadata represents all static metadata that defines what a container image is. This is useful to later describe 6 // "what" was cataloged without needing the more complicated stereoscope Image objects or FileResolver objects. 7 type ImageMetadata struct { 8 UserInput string `json:"userInput"` 9 ID string `json:"imageID"` 10 ManifestDigest string `json:"manifestDigest"` 11 MediaType string `json:"mediaType"` 12 Tags []string `json:"tags"` 13 Size int64 `json:"imageSize"` 14 Layers []LayerMetadata `json:"layers"` 15 RawManifest []byte `json:"manifest"` 16 RawConfig []byte `json:"config"` 17 RepoDigests []string `json:"repoDigests"` 18 Architecture string `json:"architecture"` 19 Variant string `json:"architectureVariant,omitempty"` 20 OS string `json:"os"` 21 } 22 23 // LayerMetadata represents all static metadata that defines what a container image layer is. 24 type LayerMetadata struct { 25 MediaType string `json:"mediaType"` 26 Digest string `json:"digest"` 27 Size int64 `json:"size"` 28 } 29 30 // NewImageMetadata creates a new ImageMetadata object populated from the given stereoscope Image object and user configuration. 31 func NewImageMetadata(img *image.Image, userInput string) ImageMetadata { 32 // populate artifacts... 33 tags := make([]string, len(img.Metadata.Tags)) 34 for idx, tag := range img.Metadata.Tags { 35 tags[idx] = tag.String() 36 } 37 theImg := ImageMetadata{ 38 ID: img.Metadata.ID, 39 UserInput: userInput, 40 ManifestDigest: img.Metadata.ManifestDigest, 41 Size: img.Metadata.Size, 42 MediaType: string(img.Metadata.MediaType), 43 Tags: tags, 44 Layers: make([]LayerMetadata, len(img.Layers)), 45 RawConfig: img.Metadata.RawConfig, 46 RawManifest: img.Metadata.RawManifest, 47 RepoDigests: img.Metadata.RepoDigests, 48 Architecture: img.Metadata.Architecture, 49 Variant: img.Metadata.Variant, 50 OS: img.Metadata.OS, 51 } 52 53 // populate image metadata 54 for idx, l := range img.Layers { 55 theImg.Layers[idx] = LayerMetadata{ 56 MediaType: string(l.Metadata.MediaType), 57 Digest: l.Metadata.Digest, 58 Size: l.Metadata.Size, 59 } 60 } 61 return theImg 62 }