Skip to content

Commit 37d805f

Browse files
Add password secret
1 parent 3e50a7d commit 37d805f

File tree

6 files changed

+118
-5
lines changed

6 files changed

+118
-5
lines changed

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ require (
4646
github.com/prometheus/client_model v0.4.0 // indirect
4747
github.com/prometheus/common v0.42.0 // indirect
4848
github.com/prometheus/procfs v0.9.0 // indirect
49+
github.com/sethvargo/go-password v0.2.0 // indirect
4950
github.com/spf13/pflag v1.0.5 // indirect
5051
go.uber.org/atomic v1.7.0 // indirect
5152
go.uber.org/multierr v1.6.0 // indirect

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr
121121
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
122122
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
123123
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
124+
github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc7i/UHI=
125+
github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE=
124126
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
125127
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
126128
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=

internal/controller/controller.go

+5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ func (r *MetabaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
4949
return ctrl.Result{}, fmt.Errorf("error getting metabase cr: %w", err)
5050
}
5151

52+
err = r.ManageSecret(ctx, metabase)
53+
if err != nil {
54+
return ctrl.Result{}, err
55+
}
56+
5257
err = r.ManageDatabase(ctx, metabase)
5358
if err != nil {
5459
return ctrl.Result{}, err

internal/controller/database.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ func (r *MetabaseReconciler) GetStatefulSet(metabase *unagexcomv1.Metabase) *app
7171
},
7272
},
7373
},
74+
{
75+
Name: metabase.Name + "-secret",
76+
VolumeSource: corev1.VolumeSource{
77+
Secret: &corev1.SecretVolumeSource{
78+
SecretName: metabase.Name + "-secret",
79+
},
80+
},
81+
},
7482
},
7583
Containers: []corev1.Container{
7684
{
@@ -109,8 +117,15 @@ func (r *MetabaseReconciler) GetStatefulSet(metabase *unagexcomv1.Metabase) *app
109117
Value: "user",
110118
},
111119
{
112-
Name: "POSTGRES_PASSWORD",
113-
Value: "password",
120+
Name: "POSTGRES_PASSWORD",
121+
ValueFrom: &corev1.EnvVarSource{
122+
SecretKeyRef: &corev1.SecretKeySelector{
123+
LocalObjectReference: corev1.LocalObjectReference{
124+
Name: metabase.Name + "-secret",
125+
},
126+
Key: "PASSWORD",
127+
},
128+
},
114129
},
115130
{
116131
Name: "POSTGRES_DB",
@@ -119,8 +134,8 @@ func (r *MetabaseReconciler) GetStatefulSet(metabase *unagexcomv1.Metabase) *app
119134
},
120135
VolumeMounts: []corev1.VolumeMount{
121136
{
122-
MountPath: "/var/lib/postgresql/data",
123137
Name: metabase.Name + "-storage",
138+
MountPath: "/var/lib/postgresql/data",
124139
},
125140
},
126141
},

internal/controller/metabase.go

+19-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,16 @@ func (r *MetabaseReconciler) GetDeployment(metabase *unagexcomv1.Metabase) *apps
6363
Labels: ls,
6464
},
6565
Spec: corev1.PodSpec{
66+
Volumes: []corev1.Volume{
67+
{
68+
Name: metabase.Name + "-secret",
69+
VolumeSource: corev1.VolumeSource{
70+
Secret: &corev1.SecretVolumeSource{
71+
SecretName: metabase.Name + "-secret",
72+
},
73+
},
74+
},
75+
},
6676
Containers: []corev1.Container{
6777
{
6878
Image: metabase.Spec.Metabase.Image,
@@ -123,8 +133,15 @@ func (r *MetabaseReconciler) GetDeployment(metabase *unagexcomv1.Metabase) *apps
123133
Value: "user",
124134
},
125135
{
126-
Name: "MB_DB_PASS",
127-
Value: "password",
136+
Name: "MB_DB_PASS",
137+
ValueFrom: &corev1.EnvVarSource{
138+
SecretKeyRef: &corev1.SecretKeySelector{
139+
LocalObjectReference: corev1.LocalObjectReference{
140+
Name: metabase.Name + "-secret",
141+
},
142+
Key: "PASSWORD",
143+
},
144+
},
128145
},
129146
{
130147
Name: "MB_DB_HOST",

internal/controller/secret.go

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package controller
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/sethvargo/go-password/password"
8+
unagexcomv1 "github.com/unagex/metabase-operator/api/v1"
9+
"github.com/unagex/metabase-operator/internal/controller/common"
10+
corev1 "k8s.io/api/core/v1"
11+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
12+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
"k8s.io/apimachinery/pkg/types"
14+
"k8s.io/utils/ptr"
15+
controllerruntime "sigs.k8s.io/controller-runtime"
16+
)
17+
18+
func (r *MetabaseReconciler) ManageSecret(ctx context.Context, metabase *unagexcomv1.Metabase) error {
19+
sec := &corev1.Secret{}
20+
err := r.Get(ctx, types.NamespacedName{
21+
Namespace: metabase.Namespace,
22+
Name: metabase.Name,
23+
}, sec)
24+
25+
// create if secret does not exist
26+
if k8serrors.IsNotFound(err) {
27+
sec, err := r.GetSecret(metabase)
28+
if err != nil {
29+
return err
30+
}
31+
32+
err = r.Create(ctx, sec)
33+
if err != nil && !k8serrors.IsAlreadyExists(err) {
34+
return fmt.Errorf("error creating secret: %w", err)
35+
}
36+
if err == nil {
37+
r.Log.Info("secret created")
38+
}
39+
return nil
40+
}
41+
42+
if err != nil {
43+
return fmt.Errorf("error getting secret: %w", err)
44+
}
45+
46+
return nil
47+
}
48+
49+
func (r *MetabaseReconciler) GetSecret(metabase *unagexcomv1.Metabase) (*corev1.Secret, error) {
50+
ls := common.GetLabels(metabase.Name, "secret")
51+
password, err := password.Generate(64, 10, 10, false, false)
52+
if err != nil {
53+
return nil, err
54+
}
55+
56+
sec := &corev1.Secret{
57+
ObjectMeta: metav1.ObjectMeta{
58+
Name: metabase.Name + "-secret",
59+
Namespace: metabase.Namespace,
60+
Labels: ls,
61+
},
62+
Immutable: ptr.To(true),
63+
Data: map[string][]byte{
64+
"PASSWORD": []byte(password),
65+
},
66+
}
67+
err = controllerruntime.SetControllerReference(metabase, sec, r.Scheme)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
return sec, nil
73+
}

0 commit comments

Comments
 (0)