Skip to content

Commit 1b85804

Browse files
authored
Add support of base64 secrets (#43)
1 parent 540830c commit 1b85804

File tree

7 files changed

+810
-27
lines changed

7 files changed

+810
-27
lines changed

cmd/manager/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ func run() error {
5151
}
5252

5353
// Become the leader before proceeding
54-
leader.Become(context.TODO(), "aws-secret-operator-lock")
54+
err = leader.Become(context.TODO(), "aws-secret-operator-lock")
55+
if err != nil {
56+
return errors.Wrap(err, "failed to became the leader")
57+
}
5558

5659
// Create a new Cmd to provide shared dependencies and start components
5760
mgr, err := manager.New(cfg, manager.Options{Namespace: namespace})

cmd/manager/root.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package main
22

33
import (
4-
"github.com/spf13/cobra"
54
"os"
5+
6+
"github.com/spf13/cobra"
67
)
78

89
type OperateOpts struct {

go.sum

Lines changed: 723 additions & 2 deletions
Large diffs are not rendered by default.

pkg/apis/mumoshu/v1alpha1/awssecret_types.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ import (
1212
type AWSSecretSpec struct {
1313
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
1414
// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
15+
16+
// DataFrom data field is used to store arbitrary data, encoded using base64.
17+
DataFrom DataFrom `json:"dataFrom,omitempty"`
18+
19+
// StringDataFrom stringData field is provided for convenience, and allows you to provide
20+
// secret data as unencoded strings.
1521
StringDataFrom StringDataFrom `json:"stringDataFrom,omitempty"`
1622

1723
// Used to facilitate programmatic handling of secret data.
@@ -24,6 +30,11 @@ type StringDataFrom struct {
2430
SecretsManagerSecretRef SecretsManagerSecretRef `json:"secretsManagerSecretRef,omitempty"`
2531
}
2632

33+
// DataFrom defines how the resulting Secret's `data` is built
34+
type DataFrom struct {
35+
SecretsManagerSecretRef SecretsManagerSecretRef `json:"secretsManagerSecretRef,omitempty"`
36+
}
37+
2738
// SecretsManagerSecretRef defines from which SecretsManager Secret the Kubernetes secret is built
2839
// See https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html for the concepts
2940
type SecretsManagerSecretRef struct {

pkg/apis/mumoshu/v1alpha1/zz_generated.deepcopy.go

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

pkg/controller/awssecret/awssecret_controller.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,37 @@ func (r *ReconcileAWSSecret) newSecretForCR(cr *mumoshuv1alpha1.AWSSecret) (*cor
148148
if r.ctx == nil {
149149
r.ctx = newContext(nil)
150150
}
151-
ref := cr.Spec.StringDataFrom.SecretsManagerSecretRef
152-
data, err := r.ctx.SecretsManagerSecretToKubernetesStringData(ref)
153-
if err != nil {
154-
return nil, errs.Wrap(err, "failed to get json secret as map")
151+
152+
var err error
153+
stringData := make(map[string]string)
154+
if cr.Spec.StringDataFrom.SecretsManagerSecretRef.SecretId != "" &&
155+
cr.Spec.StringDataFrom.SecretsManagerSecretRef.VersionId != "" {
156+
ref := cr.Spec.StringDataFrom.SecretsManagerSecretRef
157+
stringData, err = r.ctx.SecretsManagerSecretToKubernetesStringData(ref)
158+
if err != nil {
159+
return nil, errs.Wrap(err, "failed to get json secret as map")
160+
}
155161
}
162+
163+
data := make(map[string][]byte)
164+
if cr.Spec.DataFrom.SecretsManagerSecretRef.SecretId != "" &&
165+
cr.Spec.DataFrom.SecretsManagerSecretRef.VersionId != "" {
166+
ref := cr.Spec.DataFrom.SecretsManagerSecretRef
167+
data, err = r.ctx.SecretsManagerSecretToKubernetesData(ref)
168+
if err != nil {
169+
return nil, errs.Wrap(err, "failed to get json secret as map")
170+
}
171+
}
172+
156173
return &corev1.Secret{
174+
TypeMeta: metav1.TypeMeta{},
157175
ObjectMeta: metav1.ObjectMeta{
158176
Name: cr.Name,
159177
Namespace: cr.Namespace,
160178
Labels: labels,
161179
},
180+
Data: data,
181+
StringData: stringData,
162182
Type: cr.Spec.Type,
163-
StringData: data,
164183
}, nil
165184
}

pkg/controller/awssecret/secret.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package awssecret
22

33
import (
44
"encoding/json"
5+
56
"github.com/aws/aws-sdk-go/aws/session"
67
"github.com/aws/aws-sdk-go/service/secretsmanager"
78
"github.com/mumoshu/aws-secret-operator/pkg/apis/mumoshu/v1alpha1"
@@ -64,6 +65,22 @@ func (c *Context) SecretsManagerSecretToKubernetesStringData(ref v1alpha1.Secret
6465
return m, nil
6566
}
6667

68+
func (c *Context) SecretsManagerSecretToKubernetesData(ref v1alpha1.SecretsManagerSecretRef) (map[string][]byte, error) {
69+
sec, ver, err := c.String(ref.SecretId, ref.VersionId)
70+
if err != nil {
71+
return nil, err
72+
}
73+
74+
m, err := awsSecretValueToMapBytes(*sec)
75+
if err != nil {
76+
return nil, err
77+
}
78+
79+
m["AWSVersionId"] = []byte(*ver)
80+
81+
return m, nil
82+
}
83+
6784
func awsSecretValueToMap(sec string) (map[string]string, error) {
6885
m := map[string]string{}
6986
jsonerr := json.Unmarshal([]byte(sec), &m)
@@ -80,3 +97,12 @@ func awsSecretValueToMap(sec string) (map[string]string, error) {
8097
}
8198
return m, nil
8299
}
100+
101+
func awsSecretValueToMapBytes(sec string) (map[string][]byte, error) {
102+
m := map[string][]byte{}
103+
if err := json.Unmarshal([]byte(sec), &m); err != nil {
104+
return nil, err
105+
}
106+
107+
return m, nil
108+
}

0 commit comments

Comments
 (0)