Skip to content

Commit

Permalink
fix:merge image (sealerio#1070)
Browse files Browse the repository at this point in the history
  • Loading branch information
kakaZhou719 authored Jan 11, 2022
1 parent 2631061 commit 781545d
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 13 deletions.
71 changes: 59 additions & 12 deletions pkg/image/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,60 @@
package image

import (
"context"
"fmt"

"github.com/alibaba/sealer/common"
v2 "github.com/alibaba/sealer/types/api/v2"
"github.com/opencontainers/go-digest"
"golang.org/x/sync/errgroup"
"sigs.k8s.io/yaml"

"github.com/alibaba/sealer/pkg/image/store"
v1 "github.com/alibaba/sealer/types/api/v1"
)

func upImageID(imageName string, Image *v1.Image) error {
func save(imageName string, image *v1.Image) error {
var (
imageBytes []byte
imageStore store.ImageStore
err error
)
imageBytes, err = yaml.Marshal(Image)
imageStore, err = store.NewDefaultImageStore()
if err != nil {
return err
}

imageBytes, err = yaml.Marshal(image)
if err != nil {
return err
}
imageID := digest.FromBytes(imageBytes).Hex()
Image.Spec.ID = imageID
imageStore, err = store.NewDefaultImageStore()
image.Spec.ID = imageID
err = setClusterFile(imageName, image)
if err != nil {
return err
}
return imageStore.Save(*Image, imageName)
return imageStore.Save(*image, imageName)
}

func setClusterFile(imageName string, image *v1.Image) error {
var cluster v2.Cluster
if image.Annotations == nil {
return nil
}
raw := image.Annotations[common.ImageAnnotationForClusterfile]
if err := yaml.Unmarshal([]byte(raw), &cluster); err != nil {
return err
}
cluster.Spec.Image = imageName
clusterData, err := yaml.Marshal(cluster)
if err != nil {
return err
}

image.Annotations[common.ImageAnnotationForClusterfile] = string(clusterData)
return nil
}

func RemoveLayersDuplicate(list []v1.Layer) []v1.Layer {
Expand All @@ -54,6 +84,9 @@ func RemoveLayersDuplicate(list []v1.Layer) []v1.Layer {
}

func Merge(imageName string, images []string) error {
if imageName == "" {
return fmt.Errorf("target image name should not be nil")
}
var (
err error
Image = &v1.Image{}
Expand All @@ -65,12 +98,25 @@ func Merge(imageName string, images []string) error {
if err != nil {
return err
}

d := DefaultImageService{imageStore: imageStore}
eg, _ := errgroup.WithContext(context.Background())

for _, ima := range images {
im := ima
eg.Go(func() error {
err = d.PullIfNotExist(im)
if err != nil {
return err
}
return nil
})
}
if err := eg.Wait(); err != nil {
return err
}

for k, v := range images {
d := DefaultImageService{imageStore: imageStore}
err = d.PullIfNotExist(v)
if err != nil {
return err
}
img, err = d.GetImageByName(v)
if err != nil {
return err
Expand All @@ -80,9 +126,10 @@ func Merge(imageName string, images []string) error {
Image.Name = imageName
layers = img.Spec.Layers
} else {
layers = append(Image.Spec.Layers, img.Spec.Layers[1:]...)
layers = append(Image.Spec.Layers, img.Spec.Layers...)
}
Image.Spec.Layers = RemoveLayersDuplicate(layers)
}
return upImageID(imageName, Image)

return save(imageName, Image)
}
2 changes: 1 addition & 1 deletion sealer/cmd/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ merge images:
if err := image.Merge(ImageName, images); err != nil {
return err
}
logger.Info("images %s is merged to %s!", strings.Join(images, ","), ImageName)
logger.Info("images %s is merged to %s", strings.Join(images, ","), ImageName)
return nil
},
}
Expand Down

0 comments on commit 781545d

Please sign in to comment.