1 package oci_test
2
3 import (
4 "testing"
5
6 v1 "github.com/google/go-containerregistry/pkg/v1"
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9
10 "edge-infra.dev/pkg/f8n/warehouse/cluster"
11 "edge-infra.dev/pkg/f8n/warehouse/oci"
12 "edge-infra.dev/pkg/f8n/warehouse/oci/layer"
13 "edge-infra.dev/pkg/f8n/warehouse/pallet"
14 )
15
16 var providers = cluster.BuiltInProviders()
17
18 func TestIsPackage(t *testing.T) {
19 meta := makeMeta()
20 imgContent := make([]byte, 3)
21 img, idx, err := makeArtifacts(meta, imgContent)
22 require.NoError(t, err)
23
24 t.Run("image is not a package", func(t *testing.T) {
25 yes, err := oci.IsPackage(img, idx)
26 assert.NoError(t, err)
27 assert.False(t, yes)
28 })
29
30 t.Run("image is a package", func(t *testing.T) {
31 shootMeta := meta
32 meta.Name = "not-shoot"
33
34 l, err := layer.New(layer.Runtime, imgContent)
35 assert.NoError(t, err)
36
37 img2, err := pallet.Image(pallet.Options{
38 ClusterProviders: providers,
39 Metadata: meta,
40 }, l)
41 assert.NoError(t, err)
42
43 idx, err := pallet.ImageIndex(pallet.Options{
44 ClusterProviders: providers,
45 Metadata: shootMeta,
46 }, img2)
47 assert.NoError(t, err)
48
49 yes, err := oci.IsPackage(img2.Unwrap().(v1.Image), idx)
50 assert.NoError(t, err)
51 assert.True(t, yes)
52 })
53
54 t.Run("handles nil parents", func(t *testing.T) {
55 yes, err := oci.IsPackage(img, nil)
56 assert.NoError(t, err)
57 assert.True(t, yes)
58 })
59 }
60
61 func TestContains(t *testing.T) {
62 meta := makeMeta()
63 img, idx, err := makeArtifacts(meta, make([]byte, 3))
64 require.NoError(t, err)
65
66 t.Run("index contains image", func(t *testing.T) {
67 yes, err := oci.Contains(idx, img)
68 assert.NoError(t, err)
69 assert.True(t, yes)
70 })
71
72 t.Run("index contains image with wrong digest", func(t *testing.T) {
73 img2, _, err := makeArtifacts(meta, make([]byte, 10))
74 assert.NoError(t, err)
75
76 yes, err := oci.Contains(idx, img2)
77 assert.NoError(t, err)
78 assert.False(t, yes)
79 })
80
81 t.Run("index doesnt contain image", func(t *testing.T) {
82 meta.Name = "not-shoot"
83
84 img2, _, err := makeArtifacts(meta, make([]byte, 10))
85 assert.NoError(t, err)
86
87 yes, err := oci.Contains(idx, img2)
88 assert.NoError(t, err)
89 assert.False(t, yes)
90 })
91 }
92
93 func TestIsComposite(t *testing.T) {
94 meta := makeMeta()
95
96 t.Run("is not composite", func(t *testing.T) {
97 _, idx, err := makeArtifacts(meta, make([]byte, 3))
98 require.NoError(t, err)
99
100 isComposite, err := oci.IsComposite(idx)
101 assert.NoError(t, err)
102 assert.False(t, isComposite)
103 })
104
105 t.Run("is composite", func(t *testing.T) {
106 _, idx1, err := makeArtifacts(meta, make([]byte, 3))
107 require.NoError(t, err)
108
109 meta.Name = "prometheus-operator"
110 _, idx2, err := makeArtifacts(meta, make([]byte, 10))
111 require.NoError(t, err)
112
113 meta.Name = "composite-guy"
114 idx3, err := pallet.ImageIndex(pallet.Options{
115 ClusterProviders: providers,
116 Metadata: meta,
117 }, idx1, idx2)
118 require.NoError(t, err)
119
120 isComposite, err := oci.IsComposite(idx3)
121 assert.NoError(t, err)
122 assert.True(t, isComposite)
123 })
124 }
125
126 func makeArtifacts(meta pallet.Metadata, imgContent []byte) (v1.Image, v1.ImageIndex, error) {
127 l, err := layer.New(layer.Runtime, imgContent)
128 if err != nil {
129 return nil, nil, err
130 }
131
132 img, err := pallet.Image(pallet.Options{
133 ClusterProviders: providers,
134 Metadata: meta,
135 }, l)
136 if err != nil {
137 return nil, nil, err
138 }
139
140 idx, err := pallet.ImageIndex(pallet.Options{
141 ClusterProviders: providers,
142 Metadata: meta,
143 }, img)
144 if err != nil {
145 return nil, nil, err
146 }
147 return img.Unwrap().(v1.Image), idx.Unwrap().(v1.ImageIndex), nil
148 }
149
150
151 func makeMeta() pallet.Metadata {
152 return pallet.Metadata{
153 Name: "shoot",
154 Vendor: "NCR",
155 Team: "@ncrvoyix-swt-retail/edge-waterboys",
156 BuildInfo: pallet.BuildInfo{
157 Created: "yesterday",
158 Source: "https://gothub.com/ncrvoyix-swt-retail/edge-infra",
159 Revision: "d34db33f",
160 Version: "0.2.5",
161 },
162 }
163 }
164
View as plain text