-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate.go
66 lines (61 loc) · 1.66 KB
/
generate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package generate
import (
"context"
"errors"
"time"
"github.com/c2h5oh/datasize"
"github.com/google/go-containerregistry/pkg/name"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/daemon"
"github.com/google/go-containerregistry/pkg/v1/mutate"
"github.com/google/go-containerregistry/pkg/v1/random"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/types"
)
const pauseImgName = "registry.k8s.io/pause:3.7"
func Generate(ctx context.Context, imgName string, layerCount int, imageSize datasize.ByteSize) error {
layerSize, err := layerSize(layerCount, imageSize)
if err != nil {
return err
}
ref, err := name.ParseReference(pauseImgName)
if err != nil {
return err
}
img, err := remote.Image(ref, remote.WithContext(ctx))
if err != nil {
return err
}
layers := []v1.Layer{}
for range layerCount {
layer, err := random.Layer(layerSize, types.OCILayer)
if err != nil {
return err
}
layers = append(layers, layer)
}
img, err = mutate.AppendLayers(img, layers...)
if err != nil {
return err
}
img, err = mutate.CreatedAt(img, v1.Time{Time: time.Now()})
if err != nil {
return err
}
tag, err := name.NewTag(imgName)
if err != nil {
return err
}
_, err = daemon.Write(tag, img, daemon.WithContext(ctx))
if err != nil {
return err
}
return nil
}
func layerSize(layerCount int, imageSize datasize.ByteSize) (int64, error) {
layerSize := imageSize.Bytes() / uint64(layerCount)
if layerSize*uint64(layerCount) != imageSize.Bytes() {
return 0, errors.New("cannot evenly divide image size into layers")
}
return int64(layerSize), nil
}