github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/pkg/image/util.go (about)

     1  // Copyright © 2021 Alibaba Group Holding Ltd.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package image
    16  
    17  import (
    18  	"fmt"
    19  	"path/filepath"
    20  
    21  	v2 "github.com/alibaba/sealer/types/api/v2"
    22  	"github.com/opencontainers/go-digest"
    23  
    24  	"sigs.k8s.io/yaml"
    25  
    26  	"github.com/alibaba/sealer/common"
    27  	"github.com/alibaba/sealer/pkg/image/store"
    28  	v1 "github.com/alibaba/sealer/types/api/v1"
    29  )
    30  
    31  // GetImageLayerDirs return image hash list
    32  // current image is different with the image in build stage
    33  // current image has no from layer
    34  func GetImageLayerDirs(image *v1.Image) (res []string, err error) {
    35  	for _, layer := range image.Spec.Layers {
    36  		if layer.ID != "" {
    37  			res = append(res, filepath.Join(common.DefaultLayerDir, layer.ID.Hex()))
    38  		}
    39  	}
    40  	return
    41  }
    42  
    43  func GetImageDetails(idOrName string, platforms []*v1.Platform) (string, error) {
    44  	var isImageID bool
    45  	var imgs []*v1.Image
    46  
    47  	if idOrName == "" {
    48  		return "", fmt.Errorf("image id is nil")
    49  	}
    50  	imageStore, err := store.NewDefaultImageStore()
    51  	if err != nil {
    52  		return "", fmt.Errorf("failed to init image store, err: %s", err)
    53  	}
    54  	imageMetadataMap, err := imageStore.GetImageMetadataMap()
    55  	if err != nil {
    56  		return "", err
    57  	}
    58  
    59  	// detect if the input is image id.
    60  	for _, manifestList := range imageMetadataMap {
    61  		for _, m := range manifestList.Manifests {
    62  			if m.ID == idOrName {
    63  				isImageID = true
    64  				break
    65  			}
    66  		}
    67  	}
    68  
    69  	if isImageID {
    70  		ima, err := imageStore.GetByID(idOrName)
    71  		if err != nil {
    72  			return "", err
    73  		}
    74  		imgs = append(imgs, ima)
    75  	} else {
    76  		ima, err := getImageByName(idOrName, platforms, imageStore)
    77  		if err != nil {
    78  			return "", err
    79  		}
    80  		imgs = append(imgs, ima...)
    81  	}
    82  
    83  	info, err := yaml.Marshal(imgs)
    84  	if err != nil {
    85  		return "", err
    86  	}
    87  
    88  	return string(info), nil
    89  }
    90  
    91  func getImageByName(imageName string, platforms []*v1.Platform, is store.ImageStore) ([]*v1.Image, error) {
    92  	var imgs []*v1.Image
    93  
    94  	imageManifests, err := is.GetImageManifestList(imageName)
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  
    99  	if len(platforms) == 0 {
   100  		for _, m := range imageManifests {
   101  			ima, err := is.GetByID(m.ID)
   102  			if err != nil {
   103  				return nil, err
   104  			}
   105  			imgs = append(imgs, ima)
   106  		}
   107  		return imgs, nil
   108  	}
   109  
   110  	for _, p := range platforms {
   111  		ima, err := is.GetByName(imageName, p)
   112  		if err != nil {
   113  			return nil, fmt.Errorf("failed to get image %s, err: %s", imageName, err)
   114  		}
   115  		imgs = append(imgs, ima)
   116  	}
   117  	return imgs, nil
   118  }
   119  
   120  func setClusterFile(imageName string, image *v1.Image) error {
   121  	var cluster v2.Cluster
   122  	if image.Annotations == nil {
   123  		return nil
   124  	}
   125  	raw := image.Annotations[common.ImageAnnotationForClusterfile]
   126  	if err := yaml.Unmarshal([]byte(raw), &cluster); err != nil {
   127  		return err
   128  	}
   129  	cluster.Spec.Image = imageName
   130  	clusterData, err := yaml.Marshal(cluster)
   131  	if err != nil {
   132  		return err
   133  	}
   134  
   135  	image.Annotations[common.ImageAnnotationForClusterfile] = string(clusterData)
   136  	return nil
   137  }
   138  
   139  func GenerateImageID(image v1.Image) (string, error) {
   140  	imageBytes, err := yaml.Marshal(image)
   141  	if err != nil {
   142  		return "", err
   143  	}
   144  	imageID := digest.FromBytes(imageBytes).Hex()
   145  	return imageID, nil
   146  }