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  }