Skip to content

Commit 17e0f9a

Browse files
committed
Clean up tests
1 parent 8285ca7 commit 17e0f9a

File tree

3 files changed

+258
-244
lines changed

3 files changed

+258
-244
lines changed

catalogd/internal/serverutil/serverutil.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/go-logr/logr"
1313
"github.com/gorilla/handlers"
14+
"github.com/klauspost/compress/gzhttp"
1415
ctrl "sigs.k8s.io/controller-runtime"
1516
"sigs.k8s.io/controller-runtime/pkg/certwatcher"
1617
"sigs.k8s.io/controller-runtime/pkg/log"
@@ -44,9 +45,11 @@ func AddCatalogServerToManager(mgr ctrl.Manager, cfg CatalogServerConfig, tlsFil
4445
}
4546

4647
shutdownTimeout := 30 * time.Second
48+
handler := cfg.LocalStorage.StorageServerHandler()
49+
handler = gzhttp.GzipHandler(handler)
50+
handler = catalogdmetrics.AddMetricsToHandler(handler)
4751

4852
l := mgr.GetLogger().WithName("catalogd-http-server")
49-
handler := catalogdmetrics.AddMetricsToHandler(cfg.LocalStorage.StorageServerHandler())
5053
handler = logrLoggingHandler(l, handler)
5154

5255
catalogServer := manager.Server{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
package serverutil
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"io"
9+
"strings"
10+
11+
"github.com/operator-framework/operator-registry/alpha/declcfg"
12+
"sigs.k8s.io/yaml"
13+
)
14+
15+
// {
16+
// name: "provides gzipped content for the path /catalogs/test-catalog/api/v1/all with size > 1400 bytes",
17+
// setupStore: func() error {
18+
// return writeFile(filepath.Join(store.RootDir, "test-catalog3", "catalog.jsonl"), []byte(testCompressableJSON), 0600)
19+
// },
20+
// expectStatusOK: true,
21+
// expectedContent: testCompressableJSON,
22+
// URLPath: "/catalogs/test-catalog3/api/v1/all",
23+
// },
24+
25+
// jsonLineFormattedCompresableJSON, err := generateJSONLines([]byte(testCompressableJSON))
26+
// require.NoError(t, err)
27+
// {
28+
// name: "Provides JSON-lines format for the served JSON catalog",
29+
// setupStore: func() error {
30+
// unpackResultFS := &fstest.MapFS{
31+
// "catalog.json": &fstest.MapFile{Data: []byte(testCompressableJSON), Mode: os.ModePerm},
32+
// }
33+
// return store.Store(context.Background(), "test-catalog4", unpackResultFS)
34+
// },
35+
// expectStatusOK: true,
36+
// expectedContent: jsonLineFormattedCompresableJSON,
37+
// URLPath: "/catalogs/test-catalog4/api/v1/all",
38+
// },
39+
40+
// yamlData, err := makeYAMLFromConcatenatedJSON([]byte(testCompressableJSON))
41+
// require.NoError(t, err)
42+
// jsonLineFormattedYamlData, err := generateJSONLines(yamlData)
43+
// require.NoError(t, err)
44+
// {
45+
// name: "Provides JSON-lines format for the served YAML catalog",
46+
// expectStatusOK: true,
47+
// expectedContent: jsonLineFormattedYamlData,
48+
// URLPath: fmt.Sprintf("%s/test-catalog/api/v1/all", urlPrefix),
49+
// setupStore: func() error {
50+
// yamlData, err := makeYAMLFromConcatenatedJSON([]byte(testCompressableJSON))
51+
// if err != nil {
52+
// return err
53+
// }
54+
// unpackResultFS := &fstest.MapFS{
55+
// "catalog.yaml": &fstest.MapFile{Data: yamlData, Mode: os.ModePerm},
56+
// }
57+
// err = store.Store(context.Background(), "test-catalog", unpackResultFS)
58+
// if err != nil {
59+
// return err
60+
// }
61+
// return err
62+
// },
63+
// },
64+
65+
// {
66+
// name: "Ignores accept-encoding for the path /catalogs/test-catalog/api/v1/all with size < 1400 bytes",
67+
// setupStore: func() error {
68+
// return writeFile(filepath.Join(store.RootDir, "test-catalog2", "catalog.jsonl"), []byte(`{"foo":"bar"}`), 0600)
69+
// },
70+
// expectStatusOK: true,
71+
// expectedContent: `{"foo":"bar"}`,
72+
// URLPath: "/catalogs/test-catalog2/api/v1/all",
73+
// },
74+
75+
// by default the compressor will only trigger for files larger than 1400 bytes
76+
const testCompressableJSON = `{
77+
"defaultChannel": "stable-v6.x",
78+
"name": "cockroachdb",
79+
"schema": "olm.package"
80+
}
81+
{
82+
"entries": [
83+
{
84+
"name": "cockroachdb.v5.0.3"
85+
},
86+
{
87+
"name": "cockroachdb.v5.0.4",
88+
"replaces": "cockroachdb.v5.0.3"
89+
}
90+
],
91+
"name": "stable-5.x",
92+
"package": "cockroachdb",
93+
"schema": "olm.channel"
94+
}
95+
{
96+
"entries": [
97+
{
98+
"name": "cockroachdb.v6.0.0",
99+
"skipRange": "<6.0.0"
100+
}
101+
],
102+
"name": "stable-v6.x",
103+
"package": "cockroachdb",
104+
"schema": "olm.channel"
105+
}
106+
{
107+
"image": "quay.io/openshift-community-operators/cockroachdb@sha256:a5d4f4467250074216eb1ba1c36e06a3ab797d81c431427fc2aca97ecaf4e9d8",
108+
"name": "cockroachdb.v5.0.3",
109+
"package": "cockroachdb",
110+
"properties": [
111+
{
112+
"type": "olm.gvk",
113+
"value": {
114+
"group": "charts.operatorhub.io",
115+
"kind": "Cockroachdb",
116+
"version": "v1alpha1"
117+
}
118+
},
119+
{
120+
"type": "olm.package",
121+
"value": {
122+
"packageName": "cockroachdb",
123+
"version": "5.0.3"
124+
}
125+
}
126+
],
127+
"relatedImages": [
128+
{
129+
"name": "",
130+
"image": "quay.io/helmoperators/cockroachdb:v5.0.3"
131+
},
132+
{
133+
"name": "",
134+
"image": "quay.io/openshift-community-operators/cockroachdb@sha256:a5d4f4467250074216eb1ba1c36e06a3ab797d81c431427fc2aca97ecaf4e9d8"
135+
}
136+
],
137+
"schema": "olm.bundle"
138+
}
139+
{
140+
"image": "quay.io/openshift-community-operators/cockroachdb@sha256:f42337e7b85a46d83c94694638e2312e10ca16a03542399a65ba783c94a32b63",
141+
"name": "cockroachdb.v5.0.4",
142+
"package": "cockroachdb",
143+
"properties": [
144+
{
145+
"type": "olm.gvk",
146+
"value": {
147+
"group": "charts.operatorhub.io",
148+
"kind": "Cockroachdb",
149+
"version": "v1alpha1"
150+
}
151+
},
152+
{
153+
"type": "olm.package",
154+
"value": {
155+
"packageName": "cockroachdb",
156+
"version": "5.0.4"
157+
}
158+
}
159+
],
160+
"relatedImages": [
161+
{
162+
"name": "",
163+
"image": "quay.io/helmoperators/cockroachdb:v5.0.4"
164+
},
165+
{
166+
"name": "",
167+
"image": "quay.io/openshift-community-operators/cockroachdb@sha256:f42337e7b85a46d83c94694638e2312e10ca16a03542399a65ba783c94a32b63"
168+
}
169+
],
170+
"schema": "olm.bundle"
171+
}
172+
{
173+
"image": "quay.io/openshift-community-operators/cockroachdb@sha256:d3016b1507515fc7712f9c47fd9082baf9ccb070aaab58ed0ef6e5abdedde8ba",
174+
"name": "cockroachdb.v6.0.0",
175+
"package": "cockroachdb",
176+
"properties": [
177+
{
178+
"type": "olm.gvk",
179+
"value": {
180+
"group": "charts.operatorhub.io",
181+
"kind": "Cockroachdb",
182+
"version": "v1alpha1"
183+
}
184+
},
185+
{
186+
"type": "olm.package",
187+
"value": {
188+
"packageName": "cockroachdb",
189+
"version": "6.0.0"
190+
}
191+
}
192+
],
193+
"relatedImages": [
194+
{
195+
"name": "",
196+
"image": "quay.io/cockroachdb/cockroach-helm-operator:6.0.0"
197+
},
198+
{
199+
"name": "",
200+
"image": "quay.io/openshift-community-operators/cockroachdb@sha256:d3016b1507515fc7712f9c47fd9082baf9ccb070aaab58ed0ef6e5abdedde8ba"
201+
}
202+
],
203+
"schema": "olm.bundle"
204+
}
205+
`
206+
207+
// makeYAMLFromConcatenatedJSON takes a byte slice of concatenated JSON objects and returns a byte slice of concatenated YAML objects.
208+
func makeYAMLFromConcatenatedJSON(data []byte) ([]byte, error) {
209+
var msg json.RawMessage
210+
var delimiter = []byte("---\n")
211+
var yamlData []byte
212+
213+
yamlData = append(yamlData, delimiter...)
214+
215+
dec := json.NewDecoder(bytes.NewReader(data))
216+
for {
217+
err := dec.Decode(&msg)
218+
if errors.Is(err, io.EOF) {
219+
break
220+
}
221+
y, err := yaml.JSONToYAML(msg)
222+
if err != nil {
223+
return []byte{}, err
224+
}
225+
yamlData = append(yamlData, delimiter...)
226+
yamlData = append(yamlData, y...)
227+
}
228+
return yamlData, nil
229+
}
230+
231+
// generateJSONLines takes a byte slice of concatenated JSON objects and returns a JSONlines-formatted string.
232+
func generateJSONLines(in []byte) (string, error) {
233+
var out strings.Builder
234+
reader := bytes.NewReader(in)
235+
236+
err := declcfg.WalkMetasReader(reader, func(meta *declcfg.Meta, err error) error {
237+
if err != nil {
238+
return err
239+
}
240+
241+
if meta != nil && meta.Blob != nil {
242+
if meta.Blob[len(meta.Blob)-1] != '\n' {
243+
return fmt.Errorf("blob does not end with newline")
244+
}
245+
}
246+
247+
_, err = out.Write(meta.Blob)
248+
if err != nil {
249+
return err
250+
}
251+
return nil
252+
})
253+
return out.String(), err
254+
}

0 commit comments

Comments
 (0)