Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions config/namespaced/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ const (

// ErrGetPasswordSecret is an error string for failing to get password secret
ErrGetPasswordSecret = "cannot get password secret"

// errManagedNotNamespaced is an error string for non-namespaced MRs
errManagedNotNamespaced = "managed resource is not namespaced"
)

// ARNExtractor extracts ARN of the resources from "status.atProvider.arn" which
Expand Down Expand Up @@ -83,16 +86,22 @@ func PasswordGenerator(secretRefFieldPath, toggleFieldPath string) config.NewIni
// is no easy way to reduce it without making it harder to read.
return func(client client.Client) managed.Initializer {
return managed.InitializerFn(func(ctx context.Context, mg xpresource.Managed) error {
// this would be a programming/configuration error
// should be used only for namespaced MRs
if mg.GetNamespace() == "" {
return errors.New(errManagedNotNamespaced)
}

paved, err := fieldpath.PaveObject(mg)
if err != nil {
return errors.Wrap(err, "cannot pave object")
}
sel := &v1.SecretKeySelector{}
sel := &v1.LocalSecretKeySelector{}
if err := paved.GetValueInto(secretRefFieldPath, sel); err != nil {
return errors.Wrapf(xpresource.Ignore(fieldpath.IsNotFound, err), "cannot unmarshal %s into a secret key selector", secretRefFieldPath)
}
s := &corev1.Secret{}
if err := client.Get(ctx, types.NamespacedName{Namespace: sel.Namespace, Name: sel.Name}, s); xpresource.IgnoreNotFound(err) != nil {
if err := client.Get(ctx, types.NamespacedName{Namespace: mg.GetNamespace(), Name: sel.Name}, s); xpresource.IgnoreNotFound(err) != nil {
return errors.Wrap(err, ErrGetPasswordSecret)
}
if err == nil && len(s.Data[sel.Key]) != 0 {
Expand All @@ -113,7 +122,7 @@ func PasswordGenerator(secretRefFieldPath, toggleFieldPath string) config.NewIni
return errors.Wrap(err, "cannot generate password")
}
s.SetName(sel.Name)
s.SetNamespace(sel.Namespace)
s.SetNamespace(mg.GetNamespace())
if !meta.WasCreated(s) {
// We don't want to own the Secret if it is created by someone
// else, otherwise the deletion of the managed resource will
Expand Down
149 changes: 122 additions & 27 deletions config/namespaced/common/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,53 @@ func TestPasswordGenerator(t *testing.T) {
},
secretRefFieldPath: "",
toggleFieldPath: "",
mg: &fake.Managed{},
mg: &fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
},
want: want{
err: errors.Wrap(errBoom, ErrGetPasswordSecret),
},
},
"ClusterScopedMR": {
reason: "should return an error if the MR has no namespace (cluster-scoped)",
args: args{
kube: &test.MockClient{
MockGet: func(ctx context.Context, key client.ObjectKey, obj client.Object) error {
s, ok := obj.(*corev1.Secret)
if !ok {
return errors.New("needs to be secret")
}
s.Data = map[string][]byte{
"password": []byte("foo"),
}
return nil
},
},
secretRefFieldPath: "parameterizable.parameters.passwordSecretRef",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"passwordSecretRef": map[string]any{
"name": "foo",
"key": "password",
},
},
},
},
},
want: want{
err: errors.New(errManagedNotNamespaced),
},
},
"SecretAlreadyFull": {
reason: "Should be no-op if the Secret already has password.",
args: args{
Expand All @@ -73,12 +114,17 @@ func TestPasswordGenerator(t *testing.T) {
},
secretRefFieldPath: "parameterizable.parameters.passwordSecretRef",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"passwordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
},
},
Expand All @@ -102,12 +148,17 @@ func TestPasswordGenerator(t *testing.T) {
},
secretRefFieldPath: "parameterizable.parameters.masterPasswordSecretRef",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"masterPasswordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
},
},
Expand All @@ -119,6 +170,12 @@ func TestPasswordGenerator(t *testing.T) {
args: args{
secretRefFieldPath: "parameterizable.parameters.passwordSecretRef",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"another": "field",
Expand All @@ -132,6 +189,12 @@ func TestPasswordGenerator(t *testing.T) {
args: args{
secretRefFieldPath: "parameterizable.parameters.masterPasswordSecretRef",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"another": "field",
Expand All @@ -149,12 +212,17 @@ func TestPasswordGenerator(t *testing.T) {
secretRefFieldPath: "parameterizable.parameters.passwordSecretRef",
toggleFieldPath: "parameterizable.parameters.autoGeneratePassword",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"passwordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
},
},
Expand All @@ -170,6 +238,12 @@ func TestPasswordGenerator(t *testing.T) {
secretRefFieldPath: "parameterizable.parameters.masterPasswordSecretRef",
toggleFieldPath: "parameterizable.parameters.autoGeneratePassword",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"masterPasswordSecretRef": map[string]any{
Expand All @@ -191,12 +265,17 @@ func TestPasswordGenerator(t *testing.T) {
secretRefFieldPath: "parameterizable.parameters.passwordSecretRef",
toggleFieldPath: "parameterizable.parameters.autoGeneratePassword",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"passwordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
"autoGeneratePassword": false,
},
Expand All @@ -213,6 +292,12 @@ func TestPasswordGenerator(t *testing.T) {
secretRefFieldPath: "parameterizable.parameters.masterPasswordSecretRef",
toggleFieldPath: "parameterizable.parameters.autoGeneratePassword",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"masterPasswordSecretRef": map[string]any{
Expand Down Expand Up @@ -255,12 +340,17 @@ func TestPasswordGenerator(t *testing.T) {
secretRefFieldPath: "parameterizable.parameters.passwordSecretRef",
toggleFieldPath: "parameterizable.parameters.autoGeneratePassword",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"passwordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
"autoGeneratePassword": true,
},
Expand Down Expand Up @@ -297,12 +387,17 @@ func TestPasswordGenerator(t *testing.T) {
secretRefFieldPath: "parameterizable.parameters.masterPasswordSecretRef",
toggleFieldPath: "parameterizable.parameters.autoGeneratePassword",
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"masterPasswordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
"autoGeneratePassword": true,
},
Expand Down Expand Up @@ -335,15 +430,15 @@ func TestPasswordGenerator(t *testing.T) {
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"passwordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
"autoGeneratePassword": true,
},
Expand Down Expand Up @@ -376,15 +471,15 @@ func TestPasswordGenerator(t *testing.T) {
mg: &ujfake.Terraformed{
Managed: fake.Managed{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-mgd",
Name: "foo-mgd",
Namespace: "bar",
},
},
Parameterizable: ujfake.Parameterizable{
Parameters: map[string]any{
"masterPasswordSecretRef": map[string]any{
"name": "foo",
"namespace": "bar",
"key": "password",
"name": "foo",
"key": "password",
},
"autoGeneratePassword": true,
},
Expand Down
Loading