func ListImages()

in vhdbuilder/lister/pkg/image/list.go [19:69]


func ListImages(sku, version string) (*List, error) {
	client, err := containerd.New(containerdSocketPath)
	if err != nil {
		return nil, fmt.Errorf("create containerd client over socket %s: %w", containerdSocketPath, err)
	}

	ctx := namespaces.WithNamespace(context.Background(), k8sNamespace)
	imageStore := client.ImageService()
	contentStore := client.ContentStore()

	images, err := imageStore.List(ctx)
	if err != nil {
		return nil, fmt.Errorf("listing images with image service: %w", err)
	}

	digestToImage := map[string]*Image{}

	for _, image := range images {
		digest := image.Target.Digest.String()
		if _, ok := digestToImage[digest]; !ok {
			digestToImage[digest] = New()
		}
		img := digestToImage[digest]
		img.AddDigest(digest)
		if isID(image.Name) {
			if err := img.SetID(image.Name); err != nil {
				return nil, fmt.Errorf("setting ID for image digest %s: %w", digest, err)
			}
		} else {
			img.AddTag(image.Name)
		}
		size, err := image.Size(ctx, contentStore, platforms.Default())
		if err != nil {
			return nil, fmt.Errorf("calculating size for image digest %s: %w", digest, err)
		}
		if err := img.SetByteSize(size); err != nil {
			return nil, fmt.Errorf("setting size for image digest %s: %w", digest, err)
		}
	}

	var bom []*Image
	for digest := range digestToImage {
		bom = append(bom, digestToImage[digest])
	}

	return &List{
		SKU:     sku,
		Version: version,
		BOM:     bom,
	}, nil
}