diff --git a/cmd/main.go b/cmd/main.go index bb893cc..1e75ed8 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -34,7 +34,7 @@ func main() { } for _, imager := range images { - fmt.Printf("Name: %s\tLayers: %d\tSize: %d\n", imager.Name, imager.Layers, imager.Size) + fmt.Printf("Name: %s\tLayers: %d\tSize: %f\n", imager.Name, imager.Layers, imager.Size) } return nil diff --git a/pkg/imager/imager.go b/pkg/imager/imager.go index ec62618..9cf53d2 100644 --- a/pkg/imager/imager.go +++ b/pkg/imager/imager.go @@ -12,6 +12,7 @@ import ( "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chart/loader" + "helm.sh/helm/v3/pkg/chartutil" helmcli "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/registry" appsv1 "k8s.io/api/apps/v1" @@ -21,12 +22,17 @@ import ( "k8s.io/kubectl/pkg/scheme" ) -var settings = helmcli.New() +var ( + settings = helmcli.New() + + k8sVersionMajor = "1" + k8sVersionMinor = "30" +) type ImageDetails struct { Name string Layers int - Size int + Size float64 } type Imager struct { @@ -43,6 +49,15 @@ func NewImager() *Imager { cfg.RegistryClient = registryClient + capabilities := chartutil.DefaultCapabilities + capabilities.KubeVersion = chartutil.KubeVersion{ + Version: fmt.Sprintf("v%s.%s.0", k8sVersionMajor, k8sVersionMinor), + Major: k8sVersionMajor, + Minor: k8sVersionMinor, + } + + cfg.Capabilities = capabilities + client := action.NewInstall(cfg) client.DryRun = true client.ReleaseName = "imager-utility" @@ -118,15 +133,22 @@ func (i Imager) getImageDetails(_ context.Context, containerImage string) (*Imag return nil, fmt.Errorf("failed to get image layers: %w", err) } - size, err := image.Size() - if err != nil { - return nil, fmt.Errorf("failed to get image size: %w", err) + // add up the layers + totalSize := int64(0) + + for _, layer := range layers { + size, err := layer.Size() + if err != nil { + return nil, fmt.Errorf("failed to get image layer size: %w", err) + } + + totalSize += size } details := ImageDetails{ Name: containerImage, Layers: len(layers), - Size: int(size), + Size: (float64(totalSize) / (1024 * 1024)), // output in mbs } return &details, nil diff --git a/pkg/imager/imager_test.go b/pkg/imager/imager_test.go index 3845e5f..d82b33b 100644 --- a/pkg/imager/imager_test.go +++ b/pkg/imager/imager_test.go @@ -30,7 +30,7 @@ func TestImager_GetChartImagesDetails(t *testing.T) { { Name: "openfga/openfga:v1.8.2", Layers: 4, - Size: 1159, + Size: 16.662891387939453, }, }, wantErr: false, @@ -45,7 +45,7 @@ func TestImager_GetChartImagesDetails(t *testing.T) { { Name: "docker.io/bitnami/airflow:2.10.4-debian-12-r0", Layers: 1, - Size: 431, + Size: 448.5532636642456, }, }, wantErr: false,