Skip to content

Commit 9457ff9

Browse files
committed
Add tests and fix bugs for declcfg server
Signed-off-by: Joe Lanford <[email protected]>
1 parent 38d6833 commit 9457ff9

File tree

8 files changed

+794
-10
lines changed

8 files changed

+794
-10
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static: build
4242

4343
.PHONY: unit
4444
unit:
45-
$(GO) test -coverprofile=coverage.out $(SPECIFIC_UNIT_TEST) $(TAGS) $(TEST_RACE) -count=1 -v ./pkg/...
45+
$(GO) test -coverprofile=coverage.out $(SPECIFIC_UNIT_TEST) $(TAGS) $(TEST_RACE) -count=1 -v ./pkg/... ./internal/...
4646

4747
.PHONY: sanity-check
4848
sanity-check:

pkg/api/api_to_model.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,11 @@ func convertAPIBundleToModelProperties(b *Bundle) ([]property.Property, error) {
8686
k := property.GVKRequired{Group: v.Group, Kind: v.Kind, Version: v.Version}
8787
requiredGVKs[k] = struct{}{}
8888
case property.TypePackage:
89-
out = append(out, property.Property{
90-
Type: property.TypePackageRequired,
91-
Value: json.RawMessage(p.Value),
92-
})
89+
var v property.Package
90+
if err := json.Unmarshal(json.RawMessage(p.Value), &v); err != nil {
91+
return nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
92+
}
93+
out = append(out, property.MustBuildPackageRequired(v.PackageName, v.Version))
9394
}
9495
}
9596

pkg/api/conversion_test.go

Lines changed: 140 additions & 0 deletions
Large diffs are not rendered by default.

pkg/api/model_to_api.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package api
22

33
import (
4+
"encoding/json"
45
"fmt"
56

67
"github.com/operator-framework/operator-registry/internal/model"
@@ -16,6 +17,11 @@ func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) {
1617
if len(props.SkipRanges) > 0 {
1718
skipRange = string(props.SkipRanges[0])
1819
}
20+
21+
apiDeps, err := convertModelPropertiesToAPIDependencies(b.Properties)
22+
if err != nil {
23+
return nil, fmt.Errorf("convert model properties to api dependencies: %v", err)
24+
}
1925
return &Bundle{
2026
CsvName: b.Name,
2127
PackageName: b.Package.Name,
@@ -25,7 +31,7 @@ func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) {
2531
RequiredApis: gvksRequirestoAPIGVKs(props.GVKsRequired),
2632
Version: props.Packages[0].Version,
2733
SkipRange: skipRange,
28-
Dependencies: convertModelPropertiesToAPIDependencies(b.Properties),
34+
Dependencies: apiDeps,
2935
Properties: convertModelPropertiesToAPIProperties(b.Properties),
3036
Replaces: b.Replaces,
3137
Skips: b.Skips,
@@ -96,7 +102,7 @@ func convertModelPropertiesToAPIProperties(props []property.Property) []*Propert
96102
return out
97103
}
98104

99-
func convertModelPropertiesToAPIDependencies(props []property.Property) []*Dependency {
105+
func convertModelPropertiesToAPIDependencies(props []property.Property) ([]*Dependency, error) {
100106
var out []*Dependency
101107
for _, prop := range props {
102108
switch prop.Type {
@@ -106,11 +112,16 @@ func convertModelPropertiesToAPIDependencies(props []property.Property) []*Depen
106112
Value: string(prop.Value),
107113
})
108114
case property.TypePackageRequired:
115+
var v property.PackageRequired
116+
if err := json.Unmarshal(prop.Value, &v); err != nil {
117+
return nil, err
118+
}
119+
pkg := property.MustBuildPackage(v.PackageName, v.VersionRange)
109120
out = append(out, &Dependency{
110-
Type: property.TypePackage,
111-
Value: string(prop.Value),
121+
Type: pkg.Type,
122+
Value: string(pkg.Value),
112123
})
113124
}
114125
}
115-
return out
126+
return out, nil
116127
}

pkg/registry/query_test.go

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package registry
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/operator-framework/operator-registry/internal/declcfg"
10+
)
11+
12+
var testModelQuerier = genTestModelQuerier()
13+
14+
func TestQuerier_GetBundle(t *testing.T) {
15+
b, err := testModelQuerier.GetBundle(context.TODO(), "etcd", "singlenamespace-alpha", "etcdoperator.v0.9.4")
16+
require.NoError(t, err)
17+
require.Equal(t, b.PackageName, "etcd")
18+
require.Equal(t, b.ChannelName, "singlenamespace-alpha")
19+
require.Equal(t, b.CsvName, "etcdoperator.v0.9.4")
20+
}
21+
22+
func TestQuerier_GetBundleForChannel(t *testing.T) {
23+
b, err := testModelQuerier.GetBundleForChannel(context.TODO(), "etcd", "singlenamespace-alpha")
24+
require.NoError(t, err)
25+
require.NotNil(t, b)
26+
require.Equal(t, b.PackageName, "etcd")
27+
require.Equal(t, b.ChannelName, "singlenamespace-alpha")
28+
require.Equal(t, b.CsvName, "etcdoperator.v0.9.4")
29+
}
30+
31+
func TestQuerier_GetBundleThatProvides(t *testing.T) {
32+
b, err := testModelQuerier.GetBundleThatProvides(context.TODO(), "etcd.database.coreos.com", "v1beta2", "EtcdBackup")
33+
require.NoError(t, err)
34+
require.NotNil(t, b)
35+
require.Equal(t, b.PackageName, "etcd")
36+
require.Equal(t, b.ChannelName, "singlenamespace-alpha")
37+
require.Equal(t, b.CsvName, "etcdoperator.v0.9.4")
38+
}
39+
40+
func TestQuerier_GetBundleThatReplaces(t *testing.T) {
41+
b, err := testModelQuerier.GetBundleThatReplaces(context.TODO(), "etcdoperator.v0.9.0", "etcd", "singlenamespace-alpha")
42+
require.NoError(t, err)
43+
require.NotNil(t, b)
44+
require.Equal(t, b.PackageName, "etcd")
45+
require.Equal(t, b.ChannelName, "singlenamespace-alpha")
46+
require.Equal(t, b.CsvName, "etcdoperator.v0.9.2")
47+
}
48+
49+
func TestQuerier_GetChannelEntriesThatProvide(t *testing.T) {
50+
entries, err := testModelQuerier.GetChannelEntriesThatProvide(context.TODO(), "etcd.database.coreos.com", "v1beta2", "EtcdBackup")
51+
require.NoError(t, err)
52+
require.NotNil(t, entries)
53+
require.ElementsMatch(t, []*ChannelEntry{
54+
{
55+
PackageName: "etcd",
56+
ChannelName: "singlenamespace-alpha",
57+
BundleName: "etcdoperator.v0.9.0",
58+
Replaces: "",
59+
},
60+
{
61+
PackageName: "etcd",
62+
ChannelName: "singlenamespace-alpha",
63+
BundleName: "etcdoperator.v0.9.4",
64+
Replaces: "etcdoperator.v0.9.2",
65+
},
66+
{
67+
PackageName: "etcd",
68+
ChannelName: "clusterwide-alpha",
69+
BundleName: "etcdoperator.v0.9.0",
70+
Replaces: "",
71+
},
72+
{
73+
PackageName: "etcd",
74+
ChannelName: "clusterwide-alpha",
75+
BundleName: "etcdoperator.v0.9.2-clusterwide",
76+
Replaces: "etcdoperator.v0.9.0",
77+
},
78+
{
79+
PackageName: "etcd",
80+
ChannelName: "clusterwide-alpha",
81+
BundleName: "etcdoperator.v0.9.2-clusterwide",
82+
Replaces: "etcdoperator.v0.6.1",
83+
},
84+
{
85+
PackageName: "etcd",
86+
ChannelName: "clusterwide-alpha",
87+
BundleName: "etcdoperator.v0.9.4-clusterwide",
88+
Replaces: "etcdoperator.v0.9.2-clusterwide",
89+
},
90+
}, entries)
91+
}
92+
93+
func TestQuerier_GetChannelEntriesThatReplace(t *testing.T) {
94+
entries, err := testModelQuerier.GetChannelEntriesThatReplace(context.TODO(), "etcdoperator.v0.9.0")
95+
require.NoError(t, err)
96+
require.NotNil(t, entries)
97+
require.ElementsMatch(t, []*ChannelEntry{
98+
{
99+
PackageName: "etcd",
100+
ChannelName: "singlenamespace-alpha",
101+
BundleName: "etcdoperator.v0.9.2",
102+
Replaces: "etcdoperator.v0.9.0",
103+
},
104+
{
105+
PackageName: "etcd",
106+
ChannelName: "clusterwide-alpha",
107+
BundleName: "etcdoperator.v0.9.2-clusterwide",
108+
Replaces: "etcdoperator.v0.9.0",
109+
},
110+
}, entries)
111+
}
112+
113+
func TestQuerier_GetLatestChannelEntriesThatProvide(t *testing.T) {
114+
entries, err := testModelQuerier.GetLatestChannelEntriesThatProvide(context.TODO(), "etcd.database.coreos.com", "v1beta2", "EtcdBackup")
115+
require.NoError(t, err)
116+
require.NotNil(t, entries)
117+
require.ElementsMatch(t, []*ChannelEntry{
118+
{
119+
PackageName: "etcd",
120+
ChannelName: "singlenamespace-alpha",
121+
BundleName: "etcdoperator.v0.9.4",
122+
Replaces: "etcdoperator.v0.9.2",
123+
},
124+
{
125+
PackageName: "etcd",
126+
ChannelName: "clusterwide-alpha",
127+
BundleName: "etcdoperator.v0.9.4-clusterwide",
128+
Replaces: "etcdoperator.v0.9.2-clusterwide",
129+
},
130+
}, entries)
131+
}
132+
133+
func TestQuerier_GetPackage(t *testing.T) {
134+
p, err := testModelQuerier.GetPackage(context.TODO(), "etcd")
135+
require.NoError(t, err)
136+
require.NotNil(t, p)
137+
138+
expected := &PackageManifest{
139+
PackageName: "etcd",
140+
DefaultChannelName: "singlenamespace-alpha",
141+
Channels: []PackageChannel{
142+
{
143+
Name: "singlenamespace-alpha",
144+
CurrentCSVName: "etcdoperator.v0.9.4",
145+
},
146+
{
147+
Name: "clusterwide-alpha",
148+
CurrentCSVName: "etcdoperator.v0.9.4-clusterwide",
149+
},
150+
{
151+
Name: "alpha",
152+
CurrentCSVName: "etcdoperator-community.v0.6.1",
153+
},
154+
},
155+
}
156+
157+
require.ElementsMatch(t, expected.Channels, p.Channels)
158+
expected.Channels, p.Channels = nil, nil
159+
require.Equal(t, expected, p)
160+
}
161+
162+
func TestQuerier_ListBundles(t *testing.T) {
163+
bundles, err := testModelQuerier.ListBundles(context.TODO())
164+
require.NoError(t, err)
165+
require.NotNil(t, bundles)
166+
require.Equal(t, 12, len(bundles))
167+
}
168+
169+
func TestQuerier_ListPackages(t *testing.T) {
170+
packages, err := testModelQuerier.ListPackages(context.TODO())
171+
require.NoError(t, err)
172+
require.NotNil(t, packages)
173+
require.Equal(t, 2, len(packages))
174+
}
175+
176+
func genTestModelQuerier() *Querier {
177+
cfg, err := declcfg.LoadDir("testdata/validDeclCfg")
178+
if err != nil {
179+
panic(err)
180+
}
181+
m, err := declcfg.ConvertToModel(*cfg)
182+
if err != nil {
183+
panic(err)
184+
}
185+
return NewQuerier(m)
186+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
{
2+
"schema": "olm.package",
3+
"name": "cockroachdb",
4+
"defaultChannel": "stable-5.x",
5+
"icon": {
6+
"base64data": "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMS44MiAzMiIgd2lkdGg9IjI0ODYiIGhlaWdodD0iMjUwMCI+PHRpdGxlPkNMPC90aXRsZT48cGF0aCBkPSJNMTkuNDIgOS4xN2ExNS4zOSAxNS4zOSAwIDAgMS0zLjUxLjQgMTUuNDYgMTUuNDYgMCAwIDEtMy41MS0uNCAxNS42MyAxNS42MyAwIDAgMSAzLjUxLTMuOTEgMTUuNzEgMTUuNzEgMCAwIDEgMy41MSAzLjkxek0zMCAuNTdBMTcuMjIgMTcuMjIgMCAwIDAgMjUuNTkgMGExNy40IDE3LjQgMCAwIDAtOS42OCAyLjkzQTE3LjM4IDE3LjM4IDAgMCAwIDYuMjMgMGExNy4yMiAxNy4yMiAwIDAgMC00LjQ0LjU3QTE2LjIyIDE2LjIyIDAgMCAwIDAgMS4xM2EuMDcuMDcgMCAwIDAgMCAuMDkgMTcuMzIgMTcuMzIgMCAwIDAgLjgzIDEuNTcuMDcuMDcgMCAwIDAgLjA4IDAgMTYuMzkgMTYuMzkgMCAwIDEgMS44MS0uNTQgMTUuNjUgMTUuNjUgMCAwIDEgMTEuNTkgMS44OCAxNy41MiAxNy41MiAwIDAgMC0zLjc4IDQuNDhjLS4yLjMyLS4zNy42NS0uNTUgMXMtLjIyLjQ1LS4zMy42OS0uMzEuNzItLjQ0IDEuMDhhMTcuNDYgMTcuNDYgMCAwIDAgNC4yOSAxOC43Yy4yNi4yNS41My40OS44MS43M3MuNDQuMzcuNjcuNTQuNTkuNDQuODkuNjRhLjA3LjA3IDAgMCAwIC4wOCAwYy4zLS4yMS42LS40Mi44OS0uNjRzLjQ1LS4zNS42Ny0uNTQuNTUtLjQ4LjgxLS43M2ExNy40NSAxNy40NSAwIDAgMCA1LjM4LTEyLjYxIDE3LjM5IDE3LjM5IDAgMCAwLTEuMDktNi4wOWMtLjE0LS4zNy0uMjktLjczLS40NS0xLjA5cy0uMjItLjQ3LS4zMy0uNjktLjM1LS42Ni0uNTUtMWExNy42MSAxNy42MSAwIDAgMC0zLjc4LTQuNDggMTUuNjUgMTUuNjUgMCAwIDEgMTEuNi0xLjg0IDE2LjEzIDE2LjEzIDAgMCAxIDEuODEuNTQuMDcuMDcgMCAwIDAgLjA4IDBxLjQ0LS43Ni44Mi0xLjU2YS4wNy4wNyAwIDAgMCAwLS4wOUExNi44OSAxNi44OSAwIDAgMCAzMCAuNTd6IiBmaWxsPSIjMTUxZjM0Ii8+PHBhdGggZD0iTTIxLjgyIDE3LjQ3YTE1LjUxIDE1LjUxIDAgMCAxLTQuMjUgMTAuNjkgMTUuNjYgMTUuNjYgMCAwIDEtLjcyLTQuNjggMTUuNSAxNS41IDAgMCAxIDQuMjUtMTAuNjkgMTUuNjIgMTUuNjIgMCAwIDEgLjcyIDQuNjgiIGZpbGw9IiMzNDg1NDAiLz48cGF0aCBkPSJNMTUgMjMuNDhhMTUuNTUgMTUuNTUgMCAwIDEtLjcyIDQuNjggMTUuNTQgMTUuNTQgMCAwIDEtMy41My0xNS4zN0ExNS41IDE1LjUgMCAwIDEgMTUgMjMuNDgiIGZpbGw9IiM3ZGJjNDIiLz48L3N2Zz4=",
7+
"mediatype": "image/svg+xml"
8+
}
9+
}
10+
{
11+
"schema": "olm.bundle",
12+
"name": "cockroachdb.v2.0.9",
13+
"package": "cockroachdb",
14+
"image": "quay.io/openshift-community-operators/cockroachdb:v2.0.9",
15+
"properties": [
16+
{
17+
"type": "olm.channel",
18+
"value": {
19+
"name": "stable"
20+
}
21+
},
22+
{
23+
"type": "olm.package",
24+
"value": {
25+
"packageName": "cockroachdb",
26+
"version": "2.0.9"
27+
}
28+
}
29+
]
30+
}
31+
{
32+
"schema": "olm.bundle",
33+
"name": "cockroachdb.v2.1.11",
34+
"package": "cockroachdb",
35+
"image": "quay.io/openshift-community-operators/cockroachdb:v2.1.11",
36+
"properties": [
37+
{
38+
"type": "olm.channel",
39+
"value": {
40+
"name": "stable",
41+
"replaces": "cockroachdb.v2.1.1"
42+
}
43+
},
44+
{
45+
"type": "olm.package",
46+
"value": {
47+
"packageName": "cockroachdb",
48+
"version": "2.1.11"
49+
}
50+
}
51+
]
52+
}
53+
{
54+
"schema": "olm.bundle",
55+
"name": "cockroachdb.v2.1.1",
56+
"package": "cockroachdb",
57+
"image": "quay.io/openshift-community-operators/cockroachdb:v2.1.1",
58+
"properties": [
59+
{
60+
"type": "olm.channel",
61+
"value": {
62+
"name": "stable",
63+
"replaces": "cockroachdb.v2.0.9"
64+
}
65+
},
66+
{
67+
"type": "olm.package",
68+
"value": {
69+
"packageName": "cockroachdb",
70+
"version": "2.1.1"
71+
}
72+
}
73+
]
74+
}
75+
{
76+
"schema": "olm.bundle",
77+
"name": "cockroachdb.v3.0.7",
78+
"package": "cockroachdb",
79+
"image": "quay.io/openshift-community-operators/cockroachdb:v3.0.7",
80+
"properties": [
81+
{
82+
"type": "olm.channel",
83+
"value": {
84+
"name": "stable-3.x"
85+
}
86+
},
87+
{
88+
"type": "olm.package",
89+
"value": {
90+
"packageName": "cockroachdb",
91+
"version": "3.0.7"
92+
}
93+
}
94+
]
95+
}
96+
{
97+
"schema": "olm.bundle",
98+
"name": "cockroachdb.v5.0.3",
99+
"package": "cockroachdb",
100+
"image": "quay.io/openshift-community-operators/cockroachdb:v5.0.3",
101+
"properties": [
102+
{
103+
"type": "olm.channel",
104+
"value": {
105+
"name": "stable-5.x"
106+
}
107+
},
108+
{
109+
"type": "olm.package",
110+
"value": {
111+
"packageName": "cockroachdb",
112+
"version": "5.0.3"
113+
}
114+
}
115+
]
116+
}

0 commit comments

Comments
 (0)