1 package layout
2
3 import (
4 "fmt"
5 "os"
6 "testing"
7
8 "github.com/google/go-containerregistry/pkg/name"
9 "github.com/stretchr/testify/assert"
10
11 "edge-infra.dev/pkg/f8n/warehouse/cluster"
12 "edge-infra.dev/pkg/f8n/warehouse/lift"
13 "edge-infra.dev/pkg/f8n/warehouse/oci"
14 "edge-infra.dev/pkg/f8n/warehouse/oci/layer"
15 "edge-infra.dev/pkg/f8n/warehouse/pallet"
16 "edge-infra.dev/pkg/lib/build/bazel"
17 "edge-infra.dev/pkg/lib/uuid"
18 "edge-infra.dev/test/snapshot"
19 )
20
21 var (
22 tempDir string
23 )
24
25 func TestMain(m *testing.M) {
26 path, err := os.MkdirTemp("", "LayoutTest")
27 if err != nil {
28 os.Exit(1)
29 }
30 tempDir = path
31 defer os.RemoveAll(path)
32 os.Exit(m.Run())
33 }
34
35 func TestNew(t *testing.T) {
36 layout, err := New(tempDir)
37 assert.NoError(t, err)
38 assert.NotNil(t, layout)
39 }
40
41 func TestSort(t *testing.T) {
42 layout, err := New(tempDir)
43 assert.NoError(t, err)
44 assert.NotNil(t, layout)
45
46
47 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
48 assert.NoError(t, err)
49 lmperPllet, err := tempPallet("clusterctl", lmperLyer)
50 assert.NoError(t, err)
51 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "clusterctl", "test"))
52 assert.NoError(t, err)
53 assert.NoError(t, layout.Append(tagRef, lmperPllet))
54
55 lmperPllet, err = tempPallet("bannerctl", lmperLyer)
56 assert.NoError(t, err)
57 tagRef, err = name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "bannerctl", "test"))
58 assert.NoError(t, err)
59 assert.NoError(t, layout.Append(tagRef, lmperPllet))
60
61 lmperPllet, err = tempPallet("lumperctl", lmperLyer)
62 assert.NoError(t, err)
63 tagRef, err = name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumperctl", "test"))
64 assert.NoError(t, err)
65 assert.NoError(t, layout.Append(tagRef, lmperPllet))
66
67
68 assert.NoError(t, layout.Sort())
69 layoutIndex, err := layout.ImageIndex()
70 assert.NoError(t, err)
71 idx, err := layoutIndex.IndexManifest()
72 assert.NoError(t, err)
73 snapshot.Snap(t, idx)
74 }
75
76 func TestAppendTag(t *testing.T) {
77 layout, err := New(tempDir)
78 assert.NoError(t, err)
79 assert.NotNil(t, layout)
80 tag := uuid.New().Hash()
81 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
82 assert.NoError(t, err)
83 lmperPllet, err := tempPallet("clusterctl", lmperLyer)
84 assert.NoError(t, err)
85 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
86 assert.NoError(t, err)
87 assert.NoError(t, layout.Append(tagRef, lmperPllet))
88 }
89
90 func TestAppendDigest(t *testing.T) {
91 layout, err := New(tempDir)
92 assert.NoError(t, err)
93 assert.NotNil(t, layout)
94 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
95 assert.NoError(t, err)
96 lmperPllet, err := tempPallet("bannerctl", lmperLyer)
97 assert.NoError(t, err)
98 digest, err := name.NewDigest(fmt.Sprintf("%s/%s@sha256:%s", lift.LocalRegistryAlias, "lumper", "3a97b8b8a414dc3e030550ffcb05d54a93a06bbed23925914ba59b8e6fc05545"))
99 assert.NoError(t, err)
100 assert.NoError(t, layout.Append(digest, lmperPllet))
101 }
102
103 func TestGetTag(t *testing.T) {
104 layout, err := New(tempDir)
105 assert.NoError(t, err)
106 assert.NotNil(t, layout)
107 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
108 assert.NoError(t, err)
109 lmperPllet, err := tempPallet("lumper", lmperLyer)
110 assert.NoError(t, err)
111 tag := uuid.New().Hash()
112 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
113 assert.NoError(t, err)
114 assert.NoError(t, layout.Append(tagRef, lmperPllet))
115 a, err := layout.Get(tagRef)
116 assert.NoError(t, err)
117 assert.NotEmpty(t, a)
118 }
119
120 func TestAppendTagMultipleTimes(t *testing.T) {
121 layout, err := New(tempDir)
122 assert.NoError(t, err)
123 assert.NotNil(t, layout)
124 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
125 assert.NoError(t, err)
126 lmperPllet, err := tempPallet("lumper", lmperLyer)
127 assert.NoError(t, err)
128 tag := uuid.New().Hash()
129 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
130 assert.NoError(t, err)
131 for i := 0; i <= 8; i++ {
132 assert.NoError(t, err)
133 assert.NoError(t, layout.Append(tagRef, lmperPllet))
134 }
135 }
136
137 func TestAppendDigestMultipleTimes(t *testing.T) {
138 layout, err := New(tempDir)
139 assert.NoError(t, err)
140 assert.NotNil(t, layout)
141 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
142 assert.NoError(t, err)
143 lmperPllet, err := tempPallet("lumper", lmperLyer)
144 assert.NoError(t, err)
145 for i := 0; i <= 8; i++ {
146 digest, err := name.NewDigest(fmt.Sprintf("%s/%s@sha256:%s", lift.LocalRegistryAlias, "lumper", "3a97b8b8a414dc3e030550ffcb05d54a93a06bbed23925914ba59b8e6fc05545"))
147 assert.NoError(t, err)
148 assert.NoError(t, layout.Append(digest, lmperPllet))
149 }
150 }
151
152 func TestGetTagMultipleTimes(t *testing.T) {
153 layout, err := New(tempDir)
154 assert.NoError(t, err)
155 assert.NotNil(t, layout)
156 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
157 assert.NoError(t, err)
158 lmperPllet, err := tempPallet("lumper", lmperLyer)
159 assert.NoError(t, err)
160 tag := uuid.New().Hash()
161 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
162 assert.NoError(t, err)
163 for i := 0; i <= 8; i++ {
164 assert.NoError(t, layout.Append(tagRef, lmperPllet))
165 }
166 a, err := layout.Get(tagRef)
167 assert.NoError(t, err)
168 assert.NotEmpty(t, a)
169 }
170
171 func TestClear(t *testing.T) {
172 layout, err := New(tempDir)
173 assert.NoError(t, err)
174 assert.NotNil(t, layout)
175 idx, err := layout.ImageIndex()
176 assert.NoError(t, err)
177 manifest, err := idx.IndexManifest()
178 assert.NoError(t, err)
179 assert.NotEmpty(t, manifest.Manifests)
180 l, err := Clear(tempDir)
181 assert.NoError(t, err)
182 assert.NotNil(t, l)
183 i, err := l.ImageIndex()
184 assert.NoError(t, err)
185 m, err := i.IndexManifest()
186 assert.NoError(t, err)
187 assert.Empty(t, m.Manifests)
188 }
189 func TestPruneNone(t *testing.T) {
190 path, err := bazel.NewTestTmpDir("LayoutTest")
191 if err != nil {
192 t.Fatal()
193 }
194 defer os.RemoveAll(path)
195 l, err := New(path)
196 assert.NoError(t, err)
197 assert.NotNil(t, l)
198
199 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
200 assert.NoError(t, err)
201 lmperPllet, err := tempPallet("clusterctl", lmperLyer)
202 assert.NoError(t, err)
203 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "clusterctl", "test"))
204 assert.NoError(t, err)
205 assert.NoError(t, l.Append(tagRef, lmperPllet))
206 hashes, err := l.Prune()
207 assert.NoError(t, err)
208 assert.Empty(t, hashes)
209 }
210
211 func TestPrune(t *testing.T) {
212 path, err := bazel.NewTestTmpDir("LayoutTest")
213 if err != nil {
214 t.Fatal()
215 }
216 defer os.RemoveAll(path)
217 l, err := New(path)
218 assert.NoError(t, err)
219 assert.NotNil(t, l)
220 lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
221 assert.NoError(t, err)
222 lmperPllet, err := tempPallet("clusterctl", lmperLyer)
223 assert.NoError(t, err)
224 tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "clusterctl", "test"))
225 assert.NoError(t, err)
226 assert.NoError(t, l.Append(tagRef, lmperPllet))
227 grbLayer, err := createLayer(layer.Infra, []byte("test"))
228 assert.NoError(t, err)
229 digest, err := grbLayer.Digest()
230 assert.NoError(t, err)
231 uncmp, err := grbLayer.Uncompressed()
232 assert.NoError(t, err)
233 err = l.WriteBlob(digest, uncmp)
234 assert.NoError(t, err)
235 hashes, err := l.Prune()
236 assert.NoError(t, err)
237 assert.Equal(t, digest.Hex, hashes[0])
238 }
239
240 func tempPallet(name string, layers ...layer.Layer) (oci.Artifact, error) {
241 a, err := pallet.Image(pallet.Options{
242 Metadata: pallet.Metadata{
243 Name: name,
244 Team: "@ncrvoyix-swt-retail/wg-manifest-destiny",
245 BuildInfo: pallet.BuildInfo{
246 Created: "yesterday",
247 Source: "https://gothub.com/ncrvoyix-swt-retail/edge-infra",
248 Revision: "d34db33f",
249 Version: "0.2.5",
250 },
251 },
252 ClusterProviders: cluster.BuiltInProviders(),
253 }, layers...)
254 if err != nil {
255 return nil, err
256 }
257 return a, nil
258 }
259
260 func createLayer(lt layer.Type, yaml []byte) (layer.Layer, error) {
261 l, err := layer.New(lt, yaml)
262 if err != nil {
263 return nil, err
264 }
265 return l, nil
266 }
267
View as plain text