Skip to content

Commit 0552c1c

Browse files
authored
Merge branch 'master' into patch-1
2 parents 00a81d7 + dfaf273 commit 0552c1c

File tree

11 files changed

+55
-34
lines changed

11 files changed

+55
-34
lines changed

.github/workflows/validate-deployments.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
uses: actions/checkout@v4
2424

2525
- name: Set up Helm
26-
uses: azure/setup-helm@v3
26+
uses: azure/setup-helm@v4
2727
with:
2828
version: "latest"
2929

README.md

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,14 @@ Every PostgresUser has a generated Kubernetes secret attached to it, which conta
194194
| Key | Comment |
195195
|----------------------|---------------------|
196196
| `DATABASE_NAME` | Name of the database, same as in `Postgres` CR, copied for convenience |
197-
| `HOST` | PostgreSQL server host |
197+
| `HOST` | PostgreSQL server host (including port number) |
198198
| `PASSWORD` | Autogenerated password for user |
199199
| `ROLE` | Autogenerated role with login enabled (user) |
200200
| `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. |
201201
| `POSTGRES_URL` | Connection string for Posgres, could be used for Go applications |
202202
| `POSTGRES_JDBC_URL` | JDBC compatible Postgres URI, formatter as `jdbc:postgresql://{POSTGRES_HOST}/{DATABASE_NAME}` |
203+
| `HOSTNAME` | The PostgreSQL server hostname (without port) |
204+
| `PORT` | The PostgreSQL server port |
203205

204206
### Multiple operator support
205207

@@ -219,12 +221,14 @@ meeting the specific needs of different applications.
219221

220222
Available context:
221223

222-
| Variable | Meaning |
223-
|-------------|--------------------------|
224-
| `.Host` | Database host |
225-
| `.Role` | Generated user/role name |
226-
| `.Database` | Referenced database name |
227-
| `.Password` | Generated role password |
224+
| Variable | Meaning |
225+
|-------------|------------------------------|
226+
| `.Host` | Database host |
227+
| `.Role` | Generated user/role name |
228+
| `.Database` | Referenced database name |
229+
| `.Password` | Generated role password |
230+
| `.Hostname` | Database host (without port) |
231+
| `.Port` | Database port |
228232

229233
### Compatibility
230234

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ require (
88
github.com/onsi/ginkgo/v2 v2.23.3
99
github.com/onsi/gomega v1.37.0
1010
go.uber.org/mock v0.5.2
11-
k8s.io/api v0.33.2
12-
k8s.io/apimachinery v0.33.2
13-
k8s.io/client-go v0.33.2
11+
k8s.io/api v0.33.3
12+
k8s.io/apimachinery v0.33.3
13+
k8s.io/client-go v0.33.3
1414
sigs.k8s.io/controller-runtime v0.21.0
1515
)
1616

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -226,16 +226,16 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
226226
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
227227
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
228228
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
229-
k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
230-
k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
229+
k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
230+
k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
231231
k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs=
232232
k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc=
233-
k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
234-
k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
233+
k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
234+
k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
235235
k8s.io/apiserver v0.33.0 h1:QqcM6c+qEEjkOODHppFXRiw/cE2zP85704YrQ9YaBbc=
236236
k8s.io/apiserver v0.33.0/go.mod h1:EixYOit0YTxt8zrO2kBU7ixAtxFce9gKGq367nFmqI8=
237-
k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
238-
k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
237+
k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
238+
k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
239239
k8s.io/component-base v0.33.0 h1:Ot4PyJI+0JAD9covDhwLp9UNkUja209OzsJ4FzScBNk=
240240
k8s.io/component-base v0.33.0/go.mod h1:aXYZLbw3kihdkOPMDhWbjGCO6sg+luw554KP51t8qCU=
241241
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=

internal/controller/postgres_controller.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
207207
// Set privileges on schema
208208
schemaPrivilegesReader := postgres.PostgresSchemaPrivileges{
209209
DB: database,
210-
Creator: owner,
211210
Role: reader,
212211
Schema: schema,
213212
Privs: readerPrivs,
@@ -220,7 +219,6 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
220219
}
221220
schemaPrivilegesWriter := postgres.PostgresSchemaPrivileges{
222221
DB: database,
223-
Creator: owner,
224222
Role: writer,
225223
Schema: schema,
226224
Privs: writerPrivs,
@@ -233,7 +231,6 @@ func (r *PostgresReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
233231
}
234232
schemaPrivilegesOwner := postgres.PostgresSchemaPrivileges{
235233
DB: database,
236-
Creator: owner,
237234
Role: owner,
238235
Schema: schema,
239236
Privs: writerPrivs,

internal/controller/postgresuser_controller.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"maps"
7+
"net"
78

89
corev1 "k8s.io/api/core/v1"
910
"k8s.io/apimachinery/pkg/api/errors"
@@ -177,7 +178,7 @@ func (r *PostgresUserReconciler) Reconcile(ctx context.Context, req ctrl.Request
177178
return r.requeue(ctx, instance, err)
178179
}
179180

180-
secret, err := r.newSecretForCR(instance, role, password, login)
181+
secret, err := r.newSecretForCR(reqLogger, instance, role, password, login)
181182
if err != nil {
182183
return r.requeue(ctx, instance, err)
183184
}
@@ -232,10 +233,17 @@ func (r *PostgresUserReconciler) getPostgresCR(ctx context.Context, instance *db
232233
return &database, nil
233234
}
234235

235-
func (r *PostgresUserReconciler) newSecretForCR(cr *dbv1alpha1.PostgresUser, role, password, login string) (*corev1.Secret, error) {
236+
func (r *PostgresUserReconciler) newSecretForCR(reqLogger logr.Logger, cr *dbv1alpha1.PostgresUser, role, password, login string) (*corev1.Secret, error) {
237+
hostname, port, err := net.SplitHostPort(r.pgHost)
238+
if err != nil {
239+
hostname = r.pgHost
240+
port = "5432"
241+
reqLogger.Error(err, fmt.Sprintf("failed to parse host and port from: '%s', using default port 5432", r.pgHost))
242+
}
243+
236244
pgUserUrl := fmt.Sprintf("postgresql://%s:%s@%s/%s", role, password, r.pgHost, cr.Status.DatabaseName)
237245
pgJDBCUrl := fmt.Sprintf("jdbc:postgresql://%s/%s", r.pgHost, cr.Status.DatabaseName)
238-
pgDotnetUrl := fmt.Sprintf("User ID=%s;Password=%s;Host=%s;Port=5432;Database=%s;", role, password, r.pgHost, cr.Status.DatabaseName)
246+
pgDotnetUrl := fmt.Sprintf("User ID=%s;Password=%s;Host=%s;Port=%s;Database=%s;", role, password, hostname, port, cr.Status.DatabaseName)
239247
labels := map[string]string{
240248
"app": cr.Name,
241249
}
@@ -253,6 +261,8 @@ func (r *PostgresUserReconciler) newSecretForCR(cr *dbv1alpha1.PostgresUser, rol
253261
Host: r.pgHost,
254262
Database: cr.Status.DatabaseName,
255263
Password: password,
264+
Hostname: hostname,
265+
Port: port,
256266
})
257267
if err != nil {
258268
return nil, fmt.Errorf("render templated keys: %w", err)
@@ -267,6 +277,8 @@ func (r *PostgresUserReconciler) newSecretForCR(cr *dbv1alpha1.PostgresUser, rol
267277
"ROLE": []byte(role),
268278
"PASSWORD": []byte(password),
269279
"LOGIN": []byte(login),
280+
"PORT": []byte(port),
281+
"HOSTNAME": []byte(hostname),
270282
}
271283
// templates may override standard keys
272284
if len(templateData) > 0 {

internal/controller/postgresuser_controller_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
"github.com/go-logr/logr"
78
. "github.com/onsi/ginkgo/v2"
89
. "github.com/onsi/gomega"
910
"go.uber.org/mock/gomock"
@@ -324,6 +325,8 @@ var _ = Describe("PostgresUser Controller", func() {
324325
Expect(foundSecret.Data).To(HaveKey("POSTGRES_JDBC_URL"))
325326
Expect(foundSecret.Data).To(HaveKey("POSTGRES_URL"))
326327
Expect(foundSecret.Data).To(HaveKey("ROLE"))
328+
Expect(foundSecret.Data).To(HaveKey("HOSTNAME"))
329+
Expect(foundSecret.Data).To(HaveKey("PORT"))
327330
})
328331

329332
It("should fail if the database does not exist", func() {
@@ -528,7 +531,7 @@ var _ = Describe("PostgresUser Controller", func() {
528531
}
529532

530533
// Call newSecretForCR with test values
531-
secret, err := rp.newSecretForCR(cr, "role1", "pass1", "login1")
534+
secret, err := rp.newSecretForCR(logr.Discard(), cr, "role1", "pass1", "login1")
532535

533536
// Verify results
534537
Expect(err).NotTo(HaveOccurred())
@@ -574,7 +577,7 @@ var _ = Describe("PostgresUser Controller", func() {
574577
}
575578

576579
// Call newSecretForCR
577-
secret, err := rp.newSecretForCR(cr, "role2", "pass2", "login2")
580+
secret, err := rp.newSecretForCR(logr.Discard(), cr, "role2", "pass2", "login2")
578581

579582
// Verify results
580583
Expect(err).NotTo(HaveOccurred())
@@ -611,7 +614,7 @@ var _ = Describe("PostgresUser Controller", func() {
611614
}
612615

613616
// Call newSecretForCR
614-
secret, err := rp.newSecretForCR(cr, "role3", "pass3", "login3")
617+
secret, err := rp.newSecretForCR(logr.Discard(), cr, "role3", "pass3", "login3")
615618

616619
// Verify results
617620
Expect(err).NotTo(HaveOccurred())

pkg/postgres/database.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const (
1616
GRANT_USAGE_SCHEMA = `GRANT USAGE ON SCHEMA "%s" TO "%s"`
1717
GRANT_CREATE_TABLE = `GRANT CREATE ON SCHEMA "%s" TO "%s"`
1818
GRANT_ALL_TABLES = `GRANT %s ON ALL TABLES IN SCHEMA "%s" TO "%s"`
19-
DEFAULT_PRIVS_SCHEMA = `ALTER DEFAULT PRIVILEGES FOR ROLE "%s" IN SCHEMA "%s" GRANT %s ON TABLES TO "%s"`
19+
DEFAULT_PRIVS_SCHEMA = `ALTER DEFAULT PRIVILEGES IN SCHEMA "%s" GRANT %s ON TABLES TO "%s"`
2020
REVOKE_CONNECT = `REVOKE CONNECT ON DATABASE "%s" FROM public`
2121
TERMINATE_BACKEND = `SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '%s' AND pid <> pg_backend_pid()`
2222
GET_DB_OWNER = `SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = '%s'`
@@ -115,7 +115,7 @@ func (c *pg) SetSchemaPrivileges(schemaPrivileges PostgresSchemaPrivileges, logg
115115
}
116116

117117
// Grant role privs on future tables in schema
118-
_, err = tmpDb.Exec(fmt.Sprintf(DEFAULT_PRIVS_SCHEMA, schemaPrivileges.Creator, schemaPrivileges.Schema, schemaPrivileges.Privs, schemaPrivileges.Role))
118+
_, err = tmpDb.Exec(fmt.Sprintf(DEFAULT_PRIVS_SCHEMA, schemaPrivileges.Schema, schemaPrivileges.Privs, schemaPrivileges.Role))
119119
if err != nil {
120120
return err
121121
}

pkg/postgres/postgres.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ type pg struct {
3838

3939
type PostgresSchemaPrivileges struct {
4040
DB string
41-
Creator string
4241
Role string
4342
Schema string
4443
Privs string

pkg/utils/template.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ type TemplateContext struct {
1111
Role string
1212
Database string
1313
Password string
14+
Hostname string // Hostname is different from Host as it does not contain the port number.
15+
Port string
1416
}
1517

1618
func RenderTemplate(data map[string]string, tc TemplateContext) (map[string][]byte, error) {

0 commit comments

Comments
 (0)