Skip to content

Commit 0531400

Browse files
Merge pull request #28 from kevinrizza/auth-in-appregistry
Use auth from opsrc
2 parents 83a23fa + 7a4b0a3 commit 0531400

File tree

9 files changed

+164
-27
lines changed

9 files changed

+164
-27
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ require (
2828
github.com/modern-go/reflect2 v1.0.1 // indirect
2929
github.com/operator-framework/go-appr v0.0.0-20180917210448-f2aef88446f2
3030
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190125151539-1e295784b30a
31-
github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9
31+
github.com/operator-framework/operator-marketplace v0.0.0-20190216021216-57300a3ef3ba
3232
github.com/sirupsen/logrus v1.2.0
3333
github.com/soheilhy/cmux v0.1.4 // indirect
3434
github.com/spf13/cobra v0.0.3

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ github.com/operator-framework/operator-marketplace v0.0.0-20190208230340-d06f7b3
141141
github.com/operator-framework/operator-marketplace v0.0.0-20190208230340-d06f7b349013/go.mod h1:msZSL8pXwzQjB+hU+awVrZQw94IwJi3sNZVD3NoESIs=
142142
github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9 h1:VjGYvB+9cqsf0vgO7npB1bwAIslvLFqqL1ydX9ogCRM=
143143
github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9/go.mod h1:msZSL8pXwzQjB+hU+awVrZQw94IwJi3sNZVD3NoESIs=
144+
github.com/operator-framework/operator-marketplace v0.0.0-20190216021216-57300a3ef3ba h1:47MQUQRBZqwyTPLEHoFlbGRv63p0OvxpPp5g6FUQXQs=
145+
github.com/operator-framework/operator-marketplace v0.0.0-20190216021216-57300a3ef3ba/go.mod h1:msZSL8pXwzQjB+hU+awVrZQw94IwJi3sNZVD3NoESIs=
144146
github.com/operator-framework/operator-registry v1.0.1/go.mod h1:1xEdZjjUg2hPEd52LG3YQ0jtwiwEGdm98S1TH5P4RAA=
145147
github.com/operator-framework/operator-registry v1.0.4/go.mod h1:hve6YwcjM2nGVlscLtNsp9sIIBkNZo6jlJgzWw7vP9s=
146148
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=

pkg/apprclient/apprclient.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,40 @@ func NewClientFactory() ClientFactory {
1414
return &factory{}
1515
}
1616

17+
type Options struct {
18+
// Source refers to the URL of the remote app registry server.
19+
Source string
20+
21+
// AuthToken refers to the authorization token required to access operator
22+
// manifest in private repositories.
23+
//
24+
// If not set, it is assumed that the remote registry is public.
25+
AuthToken string
26+
}
27+
28+
// ClientFactory is an interface that wraps the New method.
1729
type ClientFactory interface {
18-
// New returns a new instance of appregistry Client from given source and type
19-
New(sourceType, source string) (Client, error)
30+
// New returns a new instance of appregistry Client from the specified source.
31+
New(options Options) (Client, error)
2032
}
2133

2234
type factory struct{}
2335

24-
func (f *factory) New(sourceType, source string) (Client, error) {
25-
u, err := url.Parse(source)
36+
func (f *factory) New(options Options) (Client, error) {
37+
u, err := url.Parse(options.Source)
2638
if err != nil {
2739
return nil, err
2840
}
2941

3042
transport := httptransport.New(u.Host, u.Path, []string{u.Scheme})
3143
transport.Consumers["application/x-gzip"] = runtime.ByteStreamConsumer()
44+
45+
// If a token has been specified then we should pass it along in the headers
46+
if options.AuthToken != "" {
47+
tokenAuthWriter := httptransport.APIKeyAuth("Authorization", "header", options.AuthToken)
48+
transport.DefaultAuthentication = tokenAuthWriter
49+
}
50+
3251
c := apprclient.New(transport, strfmt.Default)
3352

3453
return &client{

pkg/appregistry/appregistry.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ import (
66
marketplace "github.com/operator-framework/operator-marketplace/pkg/client/clientset/versioned"
77
"github.com/operator-framework/operator-registry/pkg/sqlite"
88
"github.com/sirupsen/logrus"
9+
"k8s.io/client-go/kubernetes"
910
"k8s.io/client-go/rest"
1011
"k8s.io/client-go/tools/clientcmd"
1112
)
1213

1314
func NewLoader(kubeconfig string, logger *logrus.Entry) (*AppregistryLoader, error) {
14-
client, err := NewClient(kubeconfig, logger)
15+
marketplaceClient, err := NewClient(kubeconfig, logger)
16+
if err != nil {
17+
return nil, err
18+
}
19+
20+
kubeClient, err := NewKubeClient(kubeconfig, logger)
1521
if err != nil {
1622
return nil, err
1723
}
@@ -20,8 +26,9 @@ func NewLoader(kubeconfig string, logger *logrus.Entry) (*AppregistryLoader, err
2026
logger: logger,
2127
input: &inputParser{},
2228
downloader: &downloader{
23-
logger: logger,
24-
client: client,
29+
logger: logger,
30+
marketplaceClient: marketplaceClient,
31+
kubeClient: *kubeClient,
2532
},
2633
merger: &merger{
2734
logger: logger,
@@ -100,3 +107,23 @@ func NewClient(kubeconfig string, logger *logrus.Entry) (clientset marketplace.I
100107
clientset, err = marketplace.NewForConfig(config)
101108
return
102109
}
110+
111+
func NewKubeClient(kubeconfig string, logger *logrus.Entry) (clientset *kubernetes.Clientset, err error) {
112+
var config *rest.Config
113+
114+
if kubeconfig != "" {
115+
logger.Infof("Loading kube client config from path %q", kubeconfig)
116+
config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
117+
} else {
118+
logger.Infof("Using in-cluster kube client config")
119+
config, err = rest.InClusterConfig()
120+
}
121+
122+
if err != nil {
123+
err = fmt.Errorf("Cannot load config for REST client: %v", err)
124+
return
125+
}
126+
127+
clientset, err = kubernetes.NewForConfig(config)
128+
return
129+
}

pkg/appregistry/downloader.go

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1111
"k8s.io/apimachinery/pkg/types"
1212
utilerrors "k8s.io/apimachinery/pkg/util/errors"
13+
"k8s.io/client-go/kubernetes"
1314
)
1415

1516
// downloadItem encapsulates the data that is needed to download a specific repository.
@@ -20,15 +21,19 @@ type downloadItem struct {
2021

2122
// Spec refers to the remote appregistry URL and remote registry namespace.
2223
Spec *v1alpha1.OperatorSourceSpec
24+
25+
// Namespace of the operatorsource that provided the information
26+
OpsrcNamespace string
2327
}
2428

2529
func (d *downloadItem) String() string {
2630
return fmt.Sprintf("%s", d.RepositoryMetadata)
2731
}
2832

2933
type downloader struct {
30-
logger *logrus.Entry
31-
client marketplace.Interface
34+
logger *logrus.Entry
35+
marketplaceClient marketplace.Interface
36+
kubeClient kubernetes.Clientset
3237
}
3338

3439
// Download downloads manifest(s) associated with the specified package(s) from
@@ -93,6 +98,7 @@ func (d *downloader) Prepare(input *Input) (items []*downloadItem, err error) {
9398
itemMap[key] = &downloadItem{
9499
RepositoryMetadata: metadata,
95100
Spec: spec,
101+
OpsrcNamespace: source.Namespace,
96102
}
97103

98104
// Remove the package specified since it has been resolved.
@@ -128,7 +134,15 @@ func (d *downloader) DownloadRepositories(items []*downloadItem) (manifests []*a
128134

129135
factory := apprclient.NewClientFactory()
130136

131-
client, err := factory.New("appregistry", endpoint)
137+
options, err := d.SetupRegistryOptions(item.Spec, item.OpsrcNamespace)
138+
if err != nil {
139+
allErrors = append(allErrors, err)
140+
d.logger.Infof("skipping repository: %s", item.RepositoryMetadata)
141+
142+
continue
143+
}
144+
145+
client, err := factory.New(*options)
132146
if err != nil {
133147
allErrors = append(allErrors, err)
134148
d.logger.Infof("skipping repository: %s", item.RepositoryMetadata)
@@ -159,13 +173,19 @@ func (d *downloader) DownloadRepositories(items []*downloadItem) (manifests []*a
159173
// in the cluster and the list of repositories in remote registry associated
160174
// with it.
161175
func (d *downloader) QuerySource(key *types.NamespacedName) (spec *v1alpha1.OperatorSourceSpec, repositories []*apprclient.RegistryMetadata, err error) {
162-
opsrc, err := d.client.MarketplaceV1alpha1().OperatorSources(key.Namespace).Get(key.Name, metav1.GetOptions{})
176+
opsrc, err := d.marketplaceClient.MarketplaceV1alpha1().OperatorSources(key.Namespace).Get(key.Name, metav1.GetOptions{})
163177
if err != nil {
164178
return
165179
}
166180

167181
factory := apprclient.NewClientFactory()
168-
client, err := factory.New("appregistry", opsrc.Spec.Endpoint)
182+
183+
options, err := d.SetupRegistryOptions(&opsrc.Spec, key.Namespace)
184+
if err != nil {
185+
return
186+
}
187+
188+
client, err := factory.New(*options)
169189
if err != nil {
170190
return
171191
}
@@ -178,3 +198,24 @@ func (d *downloader) QuerySource(key *types.NamespacedName) (spec *v1alpha1.Oper
178198
spec = &opsrc.Spec
179199
return
180200
}
201+
202+
// SetupRegistryOptions generates an Options object based on the OperatorSource spec. It passes along
203+
// the opsrc endpoint and, if defined, retrieves the authorization token from the specified Secret
204+
// object.
205+
func (d *downloader) SetupRegistryOptions(spec *v1alpha1.OperatorSourceSpec, namespace string) (*apprclient.Options, error) {
206+
options := &apprclient.Options{
207+
Source: spec.Endpoint,
208+
}
209+
210+
auth := spec.AuthorizationToken
211+
if auth.SecretName != "" {
212+
secret, err := d.kubeClient.CoreV1().Secrets(namespace).Get(auth.SecretName, metav1.GetOptions{})
213+
if err != nil {
214+
return options, err
215+
}
216+
217+
options.AuthToken = string(secret.Data["token"])
218+
}
219+
220+
return options, nil
221+
}

vendor/github.com/operator-framework/operator-marketplace/pkg/apis/marketplace/v1alpha1/catalogsourceconfig_types.go

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

vendor/github.com/operator-framework/operator-marketplace/pkg/apis/marketplace/v1alpha1/operatorsource_types.go

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

vendor/github.com/operator-framework/operator-marketplace/pkg/apis/marketplace/v1alpha1/zz_generated.deepcopy.go

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

vendor/modules.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ github.com/operator-framework/go-appr/appregistry/info
107107
github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1
108108
github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry
109109
github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators
110-
# github.com/operator-framework/operator-marketplace v0.0.0-20190212161948-a7ca81b96ad9
110+
# github.com/operator-framework/operator-marketplace v0.0.0-20190216021216-57300a3ef3ba
111111
github.com/operator-framework/operator-marketplace/pkg/apis/marketplace/v1alpha1
112112
github.com/operator-framework/operator-marketplace/pkg/client/clientset/versioned
113113
github.com/operator-framework/operator-marketplace/pkg/client/clientset/versioned/typed/marketplace/v1alpha1

0 commit comments

Comments
 (0)