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 }