github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/client/inspect_extension.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/buildpacks/pack/pkg/buildpack"
     8  	"github.com/buildpacks/pack/pkg/dist"
     9  	"github.com/buildpacks/pack/pkg/image"
    10  )
    11  
    12  type ExtensionInfo struct {
    13  	Extension dist.ModuleInfo
    14  	Location  buildpack.LocatorType
    15  }
    16  
    17  type InspectExtensionOptions struct {
    18  	ExtensionName string
    19  	Daemon        bool
    20  }
    21  
    22  func (c *Client) InspectExtension(opts InspectExtensionOptions) (*ExtensionInfo, error) {
    23  	locatorType, err := buildpack.GetLocatorType(opts.ExtensionName, "", []dist.ModuleInfo{})
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  	var layerMd dist.ModuleLayers
    28  
    29  	layerMd, err = metadataOfExtensionFromImage(c, opts.ExtensionName, opts.Daemon)
    30  
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	if len(layerMd) != 1 {
    36  		return nil, fmt.Errorf("expected 1 extension, got %d", len(layerMd))
    37  	}
    38  
    39  	return &ExtensionInfo{
    40  		Extension: extractExtension(layerMd),
    41  		Location:  locatorType,
    42  	}, nil
    43  }
    44  
    45  func metadataOfExtensionFromImage(client *Client, name string, daemon bool) (layerMd dist.ModuleLayers, err error) {
    46  	imageName := buildpack.ParsePackageLocator(name)
    47  	img, err := client.imageFetcher.Fetch(context.Background(), imageName, image.FetchOptions{Daemon: daemon, PullPolicy: image.PullNever})
    48  	if err != nil {
    49  		return dist.ModuleLayers{}, err
    50  	}
    51  
    52  	if _, err := dist.GetLabel(img, dist.ExtensionLayersLabel, &layerMd); err != nil {
    53  		return dist.ModuleLayers{}, fmt.Errorf("unable to get image label %s: %q", dist.ExtensionLayersLabel, err)
    54  	}
    55  
    56  	return layerMd, nil
    57  }
    58  
    59  func extractExtension(layerMd dist.ModuleLayers) dist.ModuleInfo {
    60  	result := dist.ModuleInfo{}
    61  	for extensionID, extensionMap := range layerMd {
    62  		for version, layerInfo := range extensionMap {
    63  			ex := dist.ModuleInfo{
    64  				ID:       extensionID,
    65  				Name:     layerInfo.Name,
    66  				Version:  version,
    67  				Homepage: layerInfo.Homepage,
    68  			}
    69  			result = ex
    70  		}
    71  	}
    72  	return result
    73  }