Skip to content

Commit 410609e

Browse files
committed
add ability to merge in uri args
1 parent 09585cf commit 410609e

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ Every PostgresUser has a generated Kubernetes secret attached to it, which conta
168168
|----------------------|---------------------|
169169
| `DATABASE_NAME` | Name of the database, same as in `Postgres` CR, copied for convenience |
170170
| `HOST` | PostgreSQL server host |
171+
| `URI_ARGS` | URI Args, same as in `Postgres` CR, copied for convenience |
171172
| `PASSWORD` | Autogenerated password for user |
172173
| `ROLE` | Autogenerated role with login enabled (user) |
173174
| `LOGIN` | Same as `ROLE`. In case `POSTGRES_CLOUD_PROVIDER` is set to "Azure", `LOGIN` it will be set to `{role}@{serverName}`, serverName is extracted from `POSTGRES_USER` from operator's config. |
@@ -202,6 +203,10 @@ Available context:
202203
| `.Database` | Referenced database name |
203204
| `.Password` | Generated role password |
204205

206+
| Functions | Meaning |
207+
|----------------|-------------------------------------------------------------------|
208+
| `mergeUriArgs` | Merge any provided uri args with any set in the `Postgres` CR |
209+
205210
### Contribution
206211

207212
You can contribute to this project by opening a PR to merge to `master`, or one of the `vX.X.X` branches.

pkg/controller/postgresuser/postgresuser_controller.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,10 @@ import (
55
"context"
66
goerr "errors"
77
"fmt"
8+
"net/url"
89
"text/template"
910

10-
"github.com/movetokube/postgres-operator/pkg/config"
11-
1211
"github.com/go-logr/logr"
13-
dbv1alpha1 "github.com/movetokube/postgres-operator/pkg/apis/db/v1alpha1"
14-
"github.com/movetokube/postgres-operator/pkg/postgres"
15-
"github.com/movetokube/postgres-operator/pkg/utils"
16-
1712
corev1 "k8s.io/api/core/v1"
1813
"k8s.io/apimachinery/pkg/api/errors"
1914
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -27,6 +22,11 @@ import (
2722
"sigs.k8s.io/controller-runtime/pkg/manager"
2823
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2924
"sigs.k8s.io/controller-runtime/pkg/source"
25+
26+
dbv1alpha1 "github.com/movetokube/postgres-operator/pkg/apis/db/v1alpha1"
27+
"github.com/movetokube/postgres-operator/pkg/config"
28+
"github.com/movetokube/postgres-operator/pkg/postgres"
29+
"github.com/movetokube/postgres-operator/pkg/utils"
3030
)
3131

3232
var log = logf.Log.WithName("controller_postgresuser")
@@ -55,6 +55,7 @@ func newReconciler(mgr manager.Manager) reconcile.Reconciler {
5555
scheme: mgr.GetScheme(),
5656
pg: pg,
5757
pgHost: c.PostgresHost,
58+
pgUriArgs: c.PostgresUriArgs,
5859
pgPort: c.PostgresPort,
5960
instanceFilter: c.AnnotationFilter,
6061
keepSecretName: c.KeepSecretName,
@@ -102,6 +103,7 @@ type ReconcilePostgresUser struct {
102103
pg postgres.PG
103104
pgHost string
104105
pgPort uint32
106+
pgUriArgs string
105107
instanceFilter string
106108
keepSecretName bool // use secret name as defined in PostgresUserSpec
107109
}
@@ -299,6 +301,7 @@ func (r *ReconcilePostgresUser) newSecretForCR(cr *dbv1alpha1.PostgresUser, role
299301
Host: fmt.Sprintf("%s:%d", r.pgHost, r.pgPort),
300302
HostNoPort: r.pgHost,
301303
Port: r.pgPort,
304+
UriArgs: r.pgUriArgs,
302305
Login: login,
303306
Database: cr.Status.DatabaseName,
304307
Password: password,
@@ -312,6 +315,7 @@ func (r *ReconcilePostgresUser) newSecretForCR(cr *dbv1alpha1.PostgresUser, role
312315
"POSTGRES_JDBC_URL": []byte(pgJDBCUrl),
313316
"POSTGRES_DOTNET_URL": []byte(pgDotnetUrl),
314317
"HOST": []byte(fmt.Sprintf("%s:%d", r.pgHost, r.pgPort)),
318+
"URI_ARGS": []byte(r.pgUriArgs),
315319
"DATABASE_NAME": []byte(cr.Status.DatabaseName),
316320
"ROLE": []byte(role),
317321
"PASSWORD": []byte(password),
@@ -393,6 +397,7 @@ type templateContext struct {
393397
Login string
394398
Database string
395399
Password string
400+
UriArgs string
396401
}
397402

398403
func renderTemplate(data map[string]string, tc templateContext) (map[string][]byte, error) {
@@ -401,7 +406,27 @@ func renderTemplate(data map[string]string, tc templateContext) (map[string][]by
401406
}
402407
var out = make(map[string][]byte, len(data))
403408
for key, templ := range data {
404-
parsed, err := template.New("").Parse(templ)
409+
tmplObj := template.New("")
410+
tmplObj.Funcs(template.FuncMap{
411+
"mergeUriArgs": func(uriArgs string) (string, error) {
412+
inputArgs, err := url.ParseQuery(uriArgs)
413+
if err != nil {
414+
return uriArgs, fmt.Errorf("unable to parse input uri args: %w", err)
415+
}
416+
417+
pgArgs, err := url.ParseQuery(tc.UriArgs)
418+
if err != nil {
419+
return uriArgs, fmt.Errorf("unable to parse pg uri args: %w", err)
420+
}
421+
422+
for argName, values := range pgArgs {
423+
inputArgs.Set(argName, values[0])
424+
}
425+
426+
return inputArgs.Encode(), nil
427+
},
428+
})
429+
parsed, err := tmplObj.Parse(templ)
405430
if err != nil {
406431
return nil, fmt.Errorf("parse template %q: %w", key, err)
407432
}

pkg/controller/postgresuser/postgresuser_controller_test.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ func assertEqual(t *testing.T, a interface{}, b interface{}) {
2020

2121
func TestReconcilePostgresUser_newSecretForCR(t *testing.T) {
2222
rpu := &ReconcilePostgresUser{
23-
pgHost: "localhost",
24-
pgPort: 5432,
23+
pgHost: "localhost",
24+
pgPort: 5432,
25+
pgUriArgs: "sslmode=disable",
2526
}
2627

2728
cr := &dbv1alpha1.PostgresUser{
@@ -30,7 +31,9 @@ func TestReconcilePostgresUser_newSecretForCR(t *testing.T) {
3031
},
3132
Spec: dbv1alpha1.PostgresUserSpec{
3233
SecretTemplate: map[string]string{
33-
"all": "host={{.Host}} host_no_port={{.HostNoPort}} port={{.Port}} user={{.Role}} login={{.Login}} password={{.Password}} dbname={{.Database}}",
34+
"all": "host={{.Host}} host_no_port={{.HostNoPort}} port={{.Port}} user={{.Role}} login={{.Login}} password={{.Password}} dbname={{.Database}}",
35+
"uriArgsFilter": `postgres://foobar?{{ "sslmode=no-verify" | mergeUriArgs }}`,
36+
"uriArgsFilterEmptyString": `postgres://foobar?{{ "" | mergeUriArgs }}`,
3437
},
3538
},
3639
}
@@ -46,5 +49,8 @@ func TestReconcilePostgresUser_newSecretForCR(t *testing.T) {
4649

4750
// keep old behavior of merging host and port
4851
assertEqual(t, string(secret.Data["HOST"]), "localhost:5432")
52+
assertEqual(t, string(secret.Data["URI_ARGS"]), "sslmode=disable")
4953
assertEqual(t, string(secret.Data["all"]), "host=localhost:5432 host_no_port=localhost port=5432 user=role login=login password=password dbname=dbname")
54+
assertEqual(t, string(secret.Data["uriArgsFilter"]), "postgres://foobar?sslmode=disable")
55+
assertEqual(t, string(secret.Data["uriArgsFilterEmptyString"]), "postgres://foobar?sslmode=disable")
5056
}

0 commit comments

Comments
 (0)