Skip to content

Commit e5823c5

Browse files
committed
use common prover gathing and fix tests
Signed-off-by: Ty Christensen <[email protected]>
1 parent 85143b7 commit e5823c5

28 files changed

+1155
-379
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package errors
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
const (
8+
errGetProviderConfig = "cannot get ProviderConfig: %s"
9+
errGetClusterProviderConfig = "cannot get ClusterProviderConfig: %s"
10+
errGetSecret = "cannot get credentials Secret: %s"
11+
errInvalidProviderConfigKind = "invalid ProviderConfig kind: %s"
12+
errNoSecretRef = "providerConfig does not reference a credentials Secret"
13+
)
14+
15+
func GetProviderConfigError(err error) error { return ErrGetProviderConfig{err} }
16+
17+
type ErrGetProviderConfig struct{ error }
18+
19+
func (e ErrGetProviderConfig) Error() string {
20+
return fmt.Sprintf(errGetProviderConfig, e.error)
21+
}
22+
23+
func (e ErrGetProviderConfig) Unwrap() error { return e.error }
24+
25+
func GetClusterProviderConfigError(err error) error { return ErrGetClusterProviderConfig{err} }
26+
27+
type ErrGetClusterProviderConfig struct{ error }
28+
29+
func (e ErrGetClusterProviderConfig) Error() string {
30+
return fmt.Sprintf(errGetClusterProviderConfig, e.error)
31+
}
32+
33+
func (e ErrGetClusterProviderConfig) Unwrap() error { return e.error }
34+
35+
func GetSecretError(err error) error { return ErrGetSecret{err} }
36+
37+
type ErrGetSecret struct{ error }
38+
39+
func (e ErrGetSecret) Error() string {
40+
return fmt.Sprintf(errGetSecret, e.error)
41+
}
42+
43+
func (e ErrGetSecret) Unwrap() error { return e.error }
44+
45+
func InvalidProviderConfigKindError(kind string) error { return ErrInvalidProviderConfigKind{kind} }
46+
47+
type ErrInvalidProviderConfigKind struct{ kind string }
48+
49+
func (e ErrInvalidProviderConfigKind) Error() string {
50+
return fmt.Sprintf(errInvalidProviderConfigKind, e.kind)
51+
}
52+
53+
func MissingSecretRefError() error { return ErrNoSecretRef{} }
54+
55+
type ErrNoSecretRef struct{}
56+
57+
func (e ErrNoSecretRef) Error() string { return errNoSecretRef }

pkg/controller/namespaced/mssql/database/reconciler.go

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import (
2020
"context"
2121

2222
"github.com/pkg/errors"
23-
corev1 "k8s.io/api/core/v1"
24-
"k8s.io/apimachinery/pkg/types"
2523
ctrl "sigs.k8s.io/controller-runtime"
2624
"sigs.k8s.io/controller-runtime/pkg/client"
2725
"sigs.k8s.io/controller-runtime/pkg/controller"
@@ -37,16 +35,12 @@ import (
3735
namespacedv1alpha1 "github.com/crossplane-contrib/provider-sql/apis/namespaced/mssql/v1alpha1"
3836
"github.com/crossplane-contrib/provider-sql/pkg/clients/mssql"
3937
"github.com/crossplane-contrib/provider-sql/pkg/clients/xsql"
38+
"github.com/crossplane-contrib/provider-sql/pkg/controller/namespaced/mssql/provider"
4039
)
4140

4241
const (
43-
errNoProviderConfig = "no providerConfigRef provided"
44-
errGetProviderConfig = "cannot get referenced ProviderConfig"
45-
errTrackUsage = "cannot track ProviderConfig usage"
46-
errTrackPCUsage = "cannot track ProviderConfig usage"
47-
errGetPC = "cannot get ProviderConfig"
48-
errNoSecretRef = "ProviderConfig does not reference a credentials Secret"
49-
errGetSecret = "cannot get credentials Secret"
42+
errTrackUsage = "cannot track ProviderConfig usage"
43+
errTrackPCUsage = "cannot track ProviderConfig usage"
5044

5145
errNotDatabase = "managed resource is not a Database custom resource"
5246
errSelectDB = "cannot select database"
@@ -116,25 +110,12 @@ func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.T
116110

117111
// ProviderConfigReference could theoretically be nil, but in practice the
118112
// DefaultProviderConfig initializer will set it before we get here.
119-
pc := &namespacedv1alpha1.ProviderConfig{}
120-
if err := c.kube.Get(ctx, types.NamespacedName{Name: cr.GetProviderConfigReference().Name}, pc); err != nil {
121-
return nil, errors.Wrap(err, errGetPC)
122-
}
123-
124-
// We don't need to check the credentials source because we currently only
125-
// support one source (MySQLConnectionSecret), which is required and
126-
// enforced by the ProviderConfig schema.
127-
ref := pc.Spec.Credentials.ConnectionSecretRef
128-
if ref == nil {
129-
return nil, errors.New(errNoSecretRef)
130-
}
131-
132-
s := &corev1.Secret{}
133-
if err := c.kube.Get(ctx, types.NamespacedName{Namespace: mg.GetNamespace(), Name: ref.Name}, s); err != nil {
134-
return nil, errors.Wrap(err, errGetSecret)
113+
providerInfo, err := provider.GetProviderConfig(ctx, c.kube, cr)
114+
if err != nil {
115+
return nil, err
135116
}
136117

137-
return &external{db: c.newClient(s.Data, "")}, nil
118+
return &external{db: c.newClient(providerInfo.SecretData, "")}, nil
138119
}
139120

140121
type external struct{ db xsql.DB }

pkg/controller/namespaced/mssql/database/reconciler_test.go

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/google/go-cmp/cmp"
2626
"github.com/pkg/errors"
2727
corev1 "k8s.io/api/core/v1"
28+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2829
"sigs.k8s.io/controller-runtime/pkg/client"
2930

3031
"github.com/crossplane/crossplane-runtime/v2/apis/common"
@@ -34,6 +35,7 @@ import (
3435
"github.com/crossplane/crossplane-runtime/v2/pkg/test"
3536

3637
"github.com/crossplane-contrib/provider-sql/pkg/clients/xsql"
38+
provErrors "github.com/crossplane-contrib/provider-sql/pkg/controller/namespaced/errors"
3739
)
3840

3941
type mockDB struct {
@@ -95,6 +97,24 @@ func TestConnect(t *testing.T) {
9597
},
9698
want: errors.Wrap(errBoom, errTrackPCUsage),
9799
},
100+
"InvalidProviderConfigKind": {
101+
reason: "An error should be returned if our ProviderConfig has an invalid kind",
102+
fields: fields{
103+
usage: resource.TrackerFn(func(ctx context.Context, mg resource.Managed) error { return nil }),
104+
},
105+
args: args{
106+
mg: &v1alpha1.Database{
107+
Spec: v1alpha1.DatabaseSpec{
108+
ManagedResourceSpec: xpv2.ManagedResourceSpec{
109+
ProviderConfigReference: &common.ProviderConfigReference{
110+
Kind: "Invalid",
111+
},
112+
},
113+
},
114+
},
115+
},
116+
want: provErrors.InvalidProviderConfigKindError("Invalid"),
117+
},
98118
"ErrGetProviderConfig": {
99119
reason: "An error should be returned if we can't get our ProviderConfig",
100120
fields: fields{
@@ -107,12 +127,37 @@ func TestConnect(t *testing.T) {
107127
mg: &v1alpha1.Database{
108128
Spec: v1alpha1.DatabaseSpec{
109129
ManagedResourceSpec: xpv2.ManagedResourceSpec{
110-
ProviderConfigReference: &common.ProviderConfigReference{},
130+
ProviderConfigReference: &common.ProviderConfigReference{
131+
Kind: v1alpha1.ProviderConfigKind,
132+
Name: "example",
133+
},
111134
},
112135
},
113136
},
114137
},
115-
want: errors.Wrap(errBoom, errGetPC),
138+
want: provErrors.GetProviderConfigError(errBoom),
139+
},
140+
"ErrGetClusterProviderConfig": {
141+
reason: "An error should be returned if we can't get our ClusterProviderConfig",
142+
fields: fields{
143+
kube: &test.MockClient{
144+
MockGet: test.NewMockGetFn(errBoom),
145+
},
146+
usage: resource.TrackerFn(func(ctx context.Context, mg resource.Managed) error { return nil }),
147+
},
148+
args: args{
149+
mg: &v1alpha1.Database{
150+
Spec: v1alpha1.DatabaseSpec{
151+
ManagedResourceSpec: xpv2.ManagedResourceSpec{
152+
ProviderConfigReference: &common.ProviderConfigReference{
153+
Kind: v1alpha1.ClusterProviderConfigKind,
154+
Name: "example",
155+
},
156+
},
157+
},
158+
},
159+
},
160+
want: provErrors.GetClusterProviderConfigError(errBoom),
116161
},
117162
"ErrMissingConnectionSecret": {
118163
reason: "An error should be returned if our ProviderConfig doesn't specify a connection secret",
@@ -127,14 +172,20 @@ func TestConnect(t *testing.T) {
127172
},
128173
args: args{
129174
mg: &v1alpha1.Database{
175+
ObjectMeta: metav1.ObjectMeta{
176+
Namespace: "default",
177+
},
130178
Spec: v1alpha1.DatabaseSpec{
131179
ManagedResourceSpec: xpv2.ManagedResourceSpec{
132-
ProviderConfigReference: &common.ProviderConfigReference{},
180+
ProviderConfigReference: &common.ProviderConfigReference{
181+
Kind: v1alpha1.ProviderConfigKind,
182+
Name: "example",
183+
},
133184
},
134185
},
135186
},
136187
},
137-
want: errors.New(errNoSecretRef),
188+
want: provErrors.MissingSecretRefError(),
138189
},
139190
"ErrGetConnectionSecret": {
140191
reason: "An error should be returned if we can't get our ProviderConfig's connection secret",
@@ -143,7 +194,7 @@ func TestConnect(t *testing.T) {
143194
MockGet: test.NewMockGetFn(nil, func(obj client.Object) error {
144195
switch o := obj.(type) {
145196
case *v1alpha1.ProviderConfig:
146-
o.Spec.Credentials.ConnectionSecretRef = &common.LocalSecretReference{}
197+
o.Spec.Credentials.ConnectionSecretRef = common.LocalSecretReference{Name: "example"}
147198
case *corev1.Secret:
148199
return errBoom
149200
}
@@ -154,14 +205,20 @@ func TestConnect(t *testing.T) {
154205
},
155206
args: args{
156207
mg: &v1alpha1.Database{
208+
ObjectMeta: metav1.ObjectMeta{
209+
Namespace: "default",
210+
},
157211
Spec: v1alpha1.DatabaseSpec{
158212
ManagedResourceSpec: xpv2.ManagedResourceSpec{
159-
ProviderConfigReference: &common.ProviderConfigReference{},
213+
ProviderConfigReference: &common.ProviderConfigReference{
214+
Kind: v1alpha1.ProviderConfigKind,
215+
Name: "example",
216+
},
160217
},
161218
},
162219
},
163220
},
164-
want: errors.Wrap(errBoom, errGetSecret),
221+
want: provErrors.GetSecretError(errBoom),
165222
},
166223
}
167224

pkg/controller/namespaced/mssql/grant/reconciler.go

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ import (
2323
"strings"
2424

2525
"github.com/pkg/errors"
26-
corev1 "k8s.io/api/core/v1"
27-
"k8s.io/apimachinery/pkg/types"
2826
"k8s.io/utils/ptr"
2927
ctrl "sigs.k8s.io/controller-runtime"
3028
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -40,13 +38,11 @@ import (
4038
namespacedv1alpha1 "github.com/crossplane-contrib/provider-sql/apis/namespaced/mssql/v1alpha1"
4139
"github.com/crossplane-contrib/provider-sql/pkg/clients/mssql"
4240
"github.com/crossplane-contrib/provider-sql/pkg/clients/xsql"
41+
"github.com/crossplane-contrib/provider-sql/pkg/controller/namespaced/mssql/provider"
4342
)
4443

4544
const (
4645
errTrackPCUsage = "cannot track ProviderConfig usage"
47-
errGetPC = "cannot get ProviderConfig"
48-
errNoSecretRef = "ProviderConfig does not reference a credentials Secret"
49-
errGetSecret = "cannot get credentials Secret"
5046

5147
errNotGrant = "managed resource is not a Grant custom resource"
5248
errGrant = "cannot grant"
@@ -117,25 +113,12 @@ func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.T
117113

118114
// ProviderConfigReference could theoretically be nil, but in practice the
119115
// DefaultProviderConfig initializer will set it before we get here.
120-
pc := &namespacedv1alpha1.ProviderConfig{}
121-
if err := c.kube.Get(ctx, types.NamespacedName{Name: cr.GetProviderConfigReference().Name}, pc); err != nil {
122-
return nil, errors.Wrap(err, errGetPC)
123-
}
124-
125-
// We don't need to check the credentials source because we currently only
126-
// support one source (MSSQLConnectionSecret), which is required and
127-
// enforced by the ProviderConfig schema.
128-
ref := pc.Spec.Credentials.ConnectionSecretRef
129-
if ref == nil {
130-
return nil, errors.New(errNoSecretRef)
131-
}
132-
133-
s := &corev1.Secret{}
134-
if err := c.kube.Get(ctx, types.NamespacedName{Namespace: mg.GetNamespace(), Name: ref.Name}, s); err != nil {
135-
return nil, errors.Wrap(err, errGetSecret)
116+
providerInfo, err := provider.GetProviderConfig(ctx, c.kube, cr)
117+
if err != nil {
118+
return nil, err
136119
}
137120

138-
return &external{db: c.newClient(s.Data, ptr.Deref(cr.Spec.ForProvider.Database, ""))}, nil
121+
return &external{db: c.newClient(providerInfo.SecretData, ptr.Deref(cr.Spec.ForProvider.Database, ""))}, nil
139122
}
140123

141124
type external struct{ db xsql.DB }

0 commit comments

Comments
 (0)