Skip to content

Commit d5fe81d

Browse files
committed
Update unit test cases to adapt to new changes in NamespaceSourceQuerier
Signed-off-by: Vu Dinh <[email protected]>
1 parent f931af4 commit d5fe81d

File tree

6 files changed

+413
-118
lines changed

6 files changed

+413
-118
lines changed

pkg/controller/registry/grpc/source.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"google.golang.org/grpc"
1010
"google.golang.org/grpc/connectivity"
1111

12+
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry"
1213
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver"
1314
"github.com/operator-framework/operator-registry/pkg/client"
1415

@@ -190,9 +191,9 @@ func (s *SourceStore) Remove(key resolver.CatalogKey) error {
190191
return source.Conn.Close()
191192
}
192193

193-
func (s *SourceStore) AsClients(namespaces ...string) (map[resolver.CatalogKey]client.Interface, map[resolver.CatalogKey]*client.Client) {
194+
func (s *SourceStore) AsClients(namespaces ...string) (map[resolver.CatalogKey]client.Interface, map[resolver.CatalogKey]registry.RegistryClientInterface) {
194195
refsInterface := map[resolver.CatalogKey]client.Interface{}
195-
refsClient := map[resolver.CatalogKey]*client.Client{}
196+
refsClient := map[resolver.CatalogKey]registry.RegistryClientInterface{}
196197
s.sourcesLock.RLock()
197198
defer s.sourcesLock.RUnlock()
198199
for key, source := range s.sources {
@@ -202,7 +203,7 @@ func (s *SourceStore) AsClients(namespaces ...string) (map[resolver.CatalogKey]c
202203
for _, namespace := range namespaces {
203204
if key.Namespace == namespace {
204205
refsInterface[key] = client.NewClientFromConn(source.Conn)
205-
refsClient[key] = client.NewClientFromConn(source.Conn)
206+
refsClient[key] = registry.NewRegistryClient(client.NewClientFromConn(source.Conn))
206207
}
207208
}
208209
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o resolver/fakes/fake_registry_client_interface.go . RegistryClientInterface
2+
package registry
3+
4+
import (
5+
"context"
6+
"fmt"
7+
"io"
8+
9+
registryapi "github.com/operator-framework/operator-registry/pkg/api"
10+
"github.com/operator-framework/operator-registry/pkg/client"
11+
opregistry "github.com/operator-framework/operator-registry/pkg/registry"
12+
)
13+
14+
var _ RegistryClientInterface = &OLMRegistryClient{}
15+
16+
type ChannelEntryStream interface {
17+
Recv() (*registryapi.ChannelEntry, error)
18+
}
19+
20+
type RegistryClientInterface interface {
21+
FindBundleThatProvides(ctx context.Context, group, version, kind, pkgName string) (*registryapi.Bundle, error)
22+
GetLatestChannelEntriesThatProvide(ctx context.Context, group, version, kind string) (*ChannelEntryIterator, error)
23+
}
24+
25+
type ChannelEntryIterator struct {
26+
stream ChannelEntryStream
27+
error error
28+
}
29+
30+
func NewChannelEntryIterator(stream ChannelEntryStream) *ChannelEntryIterator {
31+
return &ChannelEntryIterator{stream: stream}
32+
}
33+
34+
func (ceit *ChannelEntryIterator) Next() *registryapi.ChannelEntry {
35+
if ceit.error != nil {
36+
return nil
37+
}
38+
next, err := ceit.stream.Recv()
39+
if err == io.EOF {
40+
return nil
41+
}
42+
if err != nil {
43+
ceit.error = err
44+
}
45+
return next
46+
}
47+
48+
func (ceit *ChannelEntryIterator) Error() error {
49+
return ceit.error
50+
}
51+
52+
type OLMRegistryClient struct {
53+
Client *client.Client
54+
}
55+
56+
func NewRegistryClient(client *client.Client) *OLMRegistryClient {
57+
return &OLMRegistryClient{Client: client}
58+
}
59+
60+
// GetLatestChannelEntriesThatProvide uses registry client to get a list of
61+
// latest channel entries that provide the requested API (via an iterator)
62+
func (rc *OLMRegistryClient) GetLatestChannelEntriesThatProvide(ctx context.Context, group, version, kind string) (*ChannelEntryIterator, error) {
63+
stream, err := rc.Client.Registry.GetLatestChannelEntriesThatProvide(ctx, &registryapi.GetLatestProvidersRequest{Group: group, Version: version, Kind: kind})
64+
if err != nil {
65+
return nil, err
66+
}
67+
return NewChannelEntryIterator(stream), nil
68+
}
69+
70+
// FindBundleThatProvides returns a bundle that provides the request API and
71+
// doesn't belong to the provided package
72+
func (rc *OLMRegistryClient) FindBundleThatProvides(ctx context.Context, group, version, kind, pkgName string) (*registryapi.Bundle, error) {
73+
it, err := rc.GetLatestChannelEntriesThatProvide(ctx, group, version, kind)
74+
if err != nil {
75+
return nil, err
76+
}
77+
78+
entry := FilterChannelEntries(it, pkgName)
79+
if entry != nil {
80+
return nil, fmt.Errorf("Unable to find a channel entry which doesn't belong to package %s", pkgName)
81+
}
82+
bundle, err := rc.Client.Registry.GetBundle(ctx, &registryapi.GetBundleRequest{PkgName: entry.PackageName, ChannelName: entry.ChannelName, CsvName: entry.BundleName})
83+
if err != nil {
84+
return nil, err
85+
}
86+
return bundle, nil
87+
}
88+
89+
// FilterChannelEntries filters out a channel entries that provide the requested
90+
// API and come from the same package with original operator and returns the
91+
// first entry on the list
92+
func FilterChannelEntries(it *ChannelEntryIterator, pkgName string) *opregistry.ChannelEntry {
93+
var entry *opregistry.ChannelEntry
94+
for e := it.Next(); e != nil; e = it.Next() {
95+
if e.PackageName != pkgName {
96+
entry = &opregistry.ChannelEntry{
97+
PackageName: e.PackageName,
98+
ChannelName: e.ChannelName,
99+
BundleName: e.BundleName,
100+
Replaces: e.Replaces,
101+
}
102+
break
103+
}
104+
}
105+
return entry
106+
}

pkg/controller/registry/resolver/fakes/fake_registry_client_interface.go

Lines changed: 209 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)