Skip to content

Commit 83a23fa

Browse files
Merge pull request #27 from tkashem/remote-registry
Add support to download from a remote registry
2 parents 85d98d2 + 063f3f4 commit 83a23fa

File tree

133 files changed

+16316
-37
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

133 files changed

+16316
-37
lines changed

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ WORKDIR /registry
3030
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/bin/initializer /bin/initializer
3131
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/bin/registry-server /bin/registry-server
3232
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/bin/configmap-server /bin/configmap-server
33+
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/bin/appregistry-server /bin/appregistry-server
3334
COPY --from=builder /go/bin/grpc_health_probe /bin/grpc_health_probe
3435

3536
RUN chgrp -R 0 /registry && \

appr-registry.Dockerfile

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
FROM golang:1.10-alpine as builder
2+
3+
RUN apk update && apk add sqlite build-base git mercurial
4+
WORKDIR /go/src/github.com/operator-framework/operator-registry
5+
6+
COPY vendor vendor
7+
COPY cmd cmd
8+
COPY pkg pkg
9+
COPY Makefile Makefile
10+
RUN make static
11+
12+
FROM golang:1.10-alpine as probe-builder
13+
14+
RUN apk update && apk add build-base git
15+
ENV ORG github.com/grpc-ecosystem
16+
ENV PROJECT $ORG/grpc_health_probe
17+
WORKDIR /go/src/$PROJECT
18+
19+
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/vendor/$ORG/grpc-health-probe .
20+
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/vendor .
21+
RUN CGO_ENABLED=0 go install -a -tags netgo -ldflags "-w"
22+
23+
24+
FROM scratch
25+
COPY --from=builder /go/src/github.com/operator-framework/operator-registry/bin/appregistry-server /bin/appregistry-server
26+
COPY --from=probe-builder /go/bin/grpc_health_probe /bin/grpc_health_probe
27+
EXPOSE 50051
28+
ENTRYPOINT ["/bin/appregistry-server"]

cmd/appregistry-server/main.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package main
2+
3+
import (
4+
"net"
5+
6+
"github.com/sirupsen/logrus"
7+
"github.com/spf13/cobra"
8+
"google.golang.org/grpc"
9+
"google.golang.org/grpc/reflection"
10+
11+
"github.com/operator-framework/operator-registry/pkg/api"
12+
health "github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1"
13+
"github.com/operator-framework/operator-registry/pkg/appregistry"
14+
"github.com/operator-framework/operator-registry/pkg/lib/log"
15+
"github.com/operator-framework/operator-registry/pkg/server"
16+
)
17+
18+
func main() {
19+
var rootCmd = &cobra.Command{
20+
Short: "appregistry-server",
21+
Long: `appregistry-server downloads operator manifest(s) from remote appregistry, builds a sqlite database containing these downloaded manifest(s) and serves a grpc API to query it`,
22+
23+
PreRunE: func(cmd *cobra.Command, args []string) error {
24+
if debug, _ := cmd.Flags().GetBool("debug"); debug {
25+
logrus.SetLevel(logrus.DebugLevel)
26+
}
27+
return nil
28+
},
29+
30+
RunE: runCmdFunc,
31+
}
32+
33+
rootCmd.Flags().Bool("debug", false, "enable debug logging")
34+
rootCmd.Flags().StringP("kubeconfig", "k", "", "absolute path to kubeconfig file")
35+
rootCmd.Flags().StringP("database", "d", "bundles.db", "name of db to output")
36+
rootCmd.Flags().StringP("sources", "s", "", "comma separated list of OperatorSource object(s) {namespace}/{name}")
37+
rootCmd.Flags().StringP("packages", "o", "", "comma separated list of package(s) to be downloaded from the specified operator source(s)")
38+
rootCmd.Flags().StringP("port", "p", "50051", "port number to serve on")
39+
rootCmd.Flags().StringP("termination-log", "t", "/dev/termination-log", "path to a container termination log file")
40+
if err := rootCmd.Flags().MarkHidden("debug"); err != nil {
41+
logrus.Panic(err.Error())
42+
}
43+
44+
if err := rootCmd.Execute(); err != nil {
45+
logrus.Panic(err.Error())
46+
}
47+
}
48+
49+
func runCmdFunc(cmd *cobra.Command, args []string) error {
50+
// Immediately set up termination log
51+
terminationLogPath, err := cmd.Flags().GetString("termination-log")
52+
if err != nil {
53+
return err
54+
}
55+
err = log.AddDefaultWriterHooks(terminationLogPath)
56+
if err != nil {
57+
return err
58+
}
59+
kubeconfig, err := cmd.Flags().GetString("kubeconfig")
60+
if err != nil {
61+
return err
62+
}
63+
port, err := cmd.Flags().GetString("port")
64+
if err != nil {
65+
return err
66+
}
67+
sources, err := cmd.Flags().GetString("sources")
68+
if err != nil {
69+
return err
70+
}
71+
packages, err := cmd.Flags().GetString("packages")
72+
if err != nil {
73+
return err
74+
}
75+
dbName, err := cmd.Flags().GetString("database")
76+
if err != nil {
77+
return err
78+
}
79+
80+
logger := logrus.WithFields(logrus.Fields{"type": "appregistry", "port": port})
81+
82+
loader, err := appregistry.NewLoader(kubeconfig, logger)
83+
if err != nil {
84+
logger.Fatalf("error initializing - %v", err)
85+
}
86+
87+
store, err := loader.Load(dbName, sources, packages)
88+
if err != nil {
89+
logger.Fatalf("error loading manifest from remote registry - %v", err)
90+
}
91+
92+
lis, err := net.Listen("tcp", ":"+port)
93+
if err != nil {
94+
logger.Fatalf("failed to listen: %v", err)
95+
}
96+
s := grpc.NewServer()
97+
98+
api.RegisterRegistryServer(s, server.NewRegistryServer(store))
99+
health.RegisterHealthServer(s, server.NewHealthServer())
100+
reflection.Register(s)
101+
102+
logger.Info("serving registry")
103+
if err := s.Serve(lis); err != nil {
104+
logger.Fatalf("failed to serve: %v", err)
105+
}
106+
107+
return nil
108+
}

go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ require (
1111
github.com/elazarl/go-bindata-assetfs v1.0.0 // indirect
1212
github.com/emicklei/go-restful-swagger12 v0.0.0-20170926063155-7524189396c6 // indirect
1313
github.com/ghodss/yaml v1.0.0
14+
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9
15+
github.com/go-openapi/strfmt v0.18.0
1416
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff // indirect
1517
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 // indirect
18+
github.com/golang/mock v1.1.1
1619
github.com/golang/protobuf v1.2.0
1720
github.com/gorilla/websocket v1.4.0 // indirect
1821
github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17 // indirect
@@ -23,7 +26,9 @@ require (
2326
github.com/jonboulle/clockwork v0.1.0 // indirect
2427
github.com/mattn/go-sqlite3 v1.10.0
2528
github.com/modern-go/reflect2 v1.0.1 // indirect
29+
github.com/operator-framework/go-appr v0.0.0-20180917210448-f2aef88446f2
2630
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190125151539-1e295784b30a
31+
github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9
2732
github.com/sirupsen/logrus v1.2.0
2833
github.com/soheilhy/cmux v0.1.4 // indirect
2934
github.com/spf13/cobra v0.0.3
@@ -38,4 +43,5 @@ require (
3843
k8s.io/apiextensions-apiserver v0.0.0-20181204003618-e419c5771cdc
3944
k8s.io/apimachinery v0.0.0-20190118094746-1525e4dadd2d
4045
k8s.io/client-go v8.0.0+incompatible
46+
sigs.k8s.io/controller-runtime v0.1.10 // indirect
4147
)

go.sum

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4er
7474
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff h1:kOkM9whyQYodu09SJ6W3NCsHG7crFaJILQ22Gozp3lg=
7575
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
7676
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
77+
github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=
7778
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
7879
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
7980
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -86,15 +87,13 @@ github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhp
8687
github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
8788
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
8889
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
89-
github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6tubcjzGMODIVG5hlrCeImaBnZzKF2N8SM=
9090
github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
9191
github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17 h1:prg2TTpTOcJF1jRWL2zSU1FQNgB0STAFNux8GK82y8k=
9292
github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
9393
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
9494
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
9595
github.com/grpc-ecosystem/grpc-gateway v1.5.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
9696
github.com/grpc-ecosystem/grpc-gateway v1.6.3/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
97-
github.com/grpc-ecosystem/grpc-health-probe v0.2.0 h1:Os9pdioxm25j+92QbQNW7sOClH9Px9Jo9W9nhLTA5EU=
9897
github.com/grpc-ecosystem/grpc-health-probe v0.2.0/go.mod h1:4GVx/bTCtZaSzhjbGueDY5YgBdsmKeVx+LErv/n0L6s=
9998
github.com/grpc-ecosystem/grpc-health-probe v0.2.1-0.20181220223928-2bf0a5b182db h1:UxmGBzaBcWDQuQh9E1iT1dWKQFbizZ+SpTd1EL4MSqs=
10099
github.com/grpc-ecosystem/grpc-health-probe v0.2.1-0.20181220223928-2bf0a5b182db/go.mod h1:uBKkC2RbarFsvS5jMJHpVhTLvGlGQj9JJwkaePE3FWI=
@@ -132,10 +131,16 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
132131
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
133132
github.com/onsi/gomega v1.4.2-0.20180831124310-ae19f1b56d53/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
134133
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
134+
github.com/operator-framework/go-appr v0.0.0-20180917210448-f2aef88446f2 h1:c7gnBIMtxxenMKXZjeCuQaDfn7IGGmgh9laEGsOEeU4=
135+
github.com/operator-framework/go-appr v0.0.0-20180917210448-f2aef88446f2/go.mod h1:YNzwUx1i6C4dXWcffyq3yaIb0rh/K8/OvQ4vG0SNlSw=
135136
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20181023032605-e838f7fb2186/go.mod h1:Ma5ZXd4S1vmMyewWlF7aO8CZiokR7Sd8dhSfkGkNU4U=
136137
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190105193533-81104ffdc4fb/go.mod h1:XMyE4n2opUK4N6L45YGQkXXi8F9fD7XDYFv/CsS6V5I=
137-
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190125151539-1e295784b30a h1:jHgwWvjTqqg5yODVyxnya5NtIdc6G3wrxc0OzzWbSh0=
138+
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190125151539-1e295784b30a h1:gBTaGobFQZVx+M2ItXxJp7oxoc9dltkLMrkgyDE0Qfc=
138139
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190125151539-1e295784b30a/go.mod h1:vq6TTFvg6ti1Bn6ACsZneZTmjTsURgDD6tQtVDbEgsU=
140+
github.com/operator-framework/operator-marketplace v0.0.0-20190208230340-d06f7b349013 h1:SyVL/xPGF6ALLDOQNchwagHz7QvESdgiiDyNoIRnMxI=
141+
github.com/operator-framework/operator-marketplace v0.0.0-20190208230340-d06f7b349013/go.mod h1:msZSL8pXwzQjB+hU+awVrZQw94IwJi3sNZVD3NoESIs=
142+
github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9 h1:VjGYvB+9cqsf0vgO7npB1bwAIslvLFqqL1ydX9ogCRM=
143+
github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9/go.mod h1:msZSL8pXwzQjB+hU+awVrZQw94IwJi3sNZVD3NoESIs=
139144
github.com/operator-framework/operator-registry v1.0.1/go.mod h1:1xEdZjjUg2hPEd52LG3YQ0jtwiwEGdm98S1TH5P4RAA=
140145
github.com/operator-framework/operator-registry v1.0.4/go.mod h1:hve6YwcjM2nGVlscLtNsp9sIIBkNZo6jlJgzWw7vP9s=
141146
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
@@ -208,7 +213,6 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
208213
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
209214
google.golang.org/genproto v0.0.0-20181016170114-94acd270e44e h1:I5s8aUkxqPjgAssfOv+dVr+4/7BC40WV6JhcVoORltI=
210215
google.golang.org/genproto v0.0.0-20181016170114-94acd270e44e/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
211-
google.golang.org/grpc v1.16.0 h1:dz5IJGuC2BB7qXR5AyHNwAUBhZscK2xVez7mznh72sY=
212216
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
213217
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
214218
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
@@ -249,3 +253,5 @@ k8s.io/kube-openapi v0.0.0-20181031203759-72693cb1fadd h1:ggv/Vfza0i5xuhUZyYyxcc
249253
k8s.io/kube-openapi v0.0.0-20181031203759-72693cb1fadd/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
250254
k8s.io/kubernetes v1.11.7-beta.0.0.20181219023948-b875d52ea96d/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
251255
k8s.io/kubernetes v1.11.8-beta.0.0.20190124204751-3a10094374f2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
256+
sigs.k8s.io/controller-runtime v0.1.10 h1:amLOmcekVdnsD1uIpmgRqfTbQWJ2qxvQkcdeFhcotn4=
257+
sigs.k8s.io/controller-runtime v0.1.10/go.mod h1:HFAYoOh6XMV+jKF1UjFwrknPbowfyHEHHRdJMf2jMX8=

pkg/apprclient/adapter.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package apprclient
2+
3+
import (
4+
"bytes"
5+
6+
appr "github.com/operator-framework/go-appr/appregistry"
7+
apprblobs "github.com/operator-framework/go-appr/appregistry/blobs"
8+
apprpackage "github.com/operator-framework/go-appr/appregistry/package_appr"
9+
apprmodels "github.com/operator-framework/go-appr/models"
10+
)
11+
12+
const (
13+
mediaType = "helm"
14+
)
15+
16+
// This interface (internal to this package) encapsulates nitty gritty details of go-appr client bindings
17+
type apprApiAdapter interface {
18+
// ListPackages returns a list of package(s) available to the user.
19+
// When namespace is specified, only package(s) associated with the given namespace are returned.
20+
// If namespace is empty then visible package(s) across all namespaces are returned.
21+
ListPackages(namespace string) (apprmodels.Packages, error)
22+
23+
// GetPackageMetadata returns metadata associated with a given package
24+
GetPackageMetadata(namespace string, repository string, release string) (*apprmodels.Package, error)
25+
26+
// DownloadOperatorManifest downloads the blob associated with a given digest that directly corresponds to a package release
27+
DownloadOperatorManifest(namespace string, repository string, digest string) ([]byte, error)
28+
}
29+
30+
type apprApiAdapterImpl struct {
31+
client *appr.Appregistry
32+
}
33+
34+
func (a *apprApiAdapterImpl) ListPackages(namespace string) (apprmodels.Packages, error) {
35+
params := apprpackage.NewListPackagesParams()
36+
37+
if namespace != "" {
38+
params.SetNamespace(&namespace)
39+
}
40+
41+
packages, err := a.client.PackageAppr.ListPackages(params)
42+
if err != nil {
43+
return nil, err
44+
}
45+
46+
return packages.Payload, nil
47+
}
48+
49+
func (a *apprApiAdapterImpl) GetPackageMetadata(namespace string, repository string, release string) (*apprmodels.Package, error) {
50+
params := apprpackage.NewShowPackageParams().
51+
WithNamespace(namespace).
52+
WithPackage(repository).
53+
WithRelease(release).
54+
WithMediaType(mediaType)
55+
56+
pkg, err := a.client.PackageAppr.ShowPackage(params)
57+
if err != nil {
58+
return nil, err
59+
}
60+
61+
return pkg.Payload, nil
62+
}
63+
64+
func (a *apprApiAdapterImpl) DownloadOperatorManifest(namespace string, repository string, digest string) ([]byte, error) {
65+
params := apprblobs.NewPullBlobParams().
66+
WithNamespace(namespace).
67+
WithPackage(repository).
68+
WithDigest(digest)
69+
70+
writer := &bytes.Buffer{}
71+
_, err := a.client.Blobs.PullBlob(params, writer)
72+
if err != nil {
73+
return nil, err
74+
}
75+
76+
return writer.Bytes(), nil
77+
}

pkg/apprclient/apprclient.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package apprclient
2+
3+
import (
4+
"net/url"
5+
6+
"github.com/go-openapi/runtime"
7+
httptransport "github.com/go-openapi/runtime/client"
8+
"github.com/go-openapi/strfmt"
9+
apprclient "github.com/operator-framework/go-appr/appregistry"
10+
)
11+
12+
// NewClientFactory return a factory which can be used to instantiate a new appregistry client
13+
func NewClientFactory() ClientFactory {
14+
return &factory{}
15+
}
16+
17+
type ClientFactory interface {
18+
// New returns a new instance of appregistry Client from given source and type
19+
New(sourceType, source string) (Client, error)
20+
}
21+
22+
type factory struct{}
23+
24+
func (f *factory) New(sourceType, source string) (Client, error) {
25+
u, err := url.Parse(source)
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
transport := httptransport.New(u.Host, u.Path, []string{u.Scheme})
31+
transport.Consumers["application/x-gzip"] = runtime.ByteStreamConsumer()
32+
c := apprclient.New(transport, strfmt.Default)
33+
34+
return &client{
35+
adapter: &apprApiAdapterImpl{client: c},
36+
decoder: &blobDecoderImpl{},
37+
}, nil
38+
}

0 commit comments

Comments
 (0)