github.com/buildpack/pack@v0.5.0/inspect_image.go (about)

     1  package pack
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  
     7  	"github.com/Masterminds/semver"
     8  	"github.com/buildpack/lifecycle/metadata"
     9  	"github.com/pkg/errors"
    10  
    11  	"github.com/buildpack/pack/image"
    12  )
    13  
    14  type ImageInfo struct {
    15  	StackID    string
    16  	Buildpacks []metadata.BuildpackMetadata
    17  	Base       metadata.RunImageMetadata
    18  	BOM        interface{}
    19  	Stack      metadata.StackMetadata
    20  }
    21  
    22  func (c *Client) InspectImage(name string, daemon bool) (*ImageInfo, error) {
    23  	img, err := c.imageFetcher.Fetch(context.Background(), name, daemon, false)
    24  	if err != nil {
    25  		if errors.Cause(err) == image.ErrNotFound {
    26  			return nil, nil
    27  		}
    28  		return nil, err
    29  	}
    30  	rawLayersMd, err := metadata.GetRawMetadata(img, metadata.LayerMetadataLabel)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	var layersMd metadata.LayersMetadata
    35  	if rawLayersMd != "" {
    36  		if err := json.Unmarshal([]byte(rawLayersMd), &layersMd); err != nil {
    37  			return nil, errors.Wrapf(err, "failed to parse label '%s'", metadata.LayerMetadataLabel)
    38  		}
    39  	}
    40  
    41  	rawBuildMd, _ := metadata.GetRawMetadata(img, metadata.BuildMetadataLabel)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	var buildMD metadata.BuildMetadata
    46  	if rawBuildMd != "" {
    47  		if err := json.Unmarshal([]byte(rawBuildMd), &buildMD); err != nil {
    48  			return nil, errors.Wrapf(err, "failed to parse label '%s'", metadata.BuildMetadataLabel)
    49  		}
    50  	}
    51  
    52  	minimumBaseImageReferenceVersion := semver.MustParse("0.5.0")
    53  	actualLauncherVersion, err := semver.NewVersion(buildMD.Launcher.Version)
    54  
    55  	if err == nil && actualLauncherVersion.LessThan(minimumBaseImageReferenceVersion) {
    56  		layersMd.RunImage.Reference = ""
    57  	}
    58  
    59  	stackID, err := metadata.GetRawMetadata(img, metadata.StackMetadataLabel)
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  
    64  	return &ImageInfo{
    65  		StackID:    stackID,
    66  		Stack:      layersMd.Stack,
    67  		Base:       layersMd.RunImage,
    68  		BOM:        buildMD.BOM,
    69  		Buildpacks: buildMD.Buildpacks,
    70  	}, nil
    71  }