Skip to content

Commit 565e3dd

Browse files
committed
fix: Changing authenticator username breaks PgBouncer
1 parent 051b3d4 commit 565e3dd

3 files changed

Lines changed: 46 additions & 23 deletions

File tree

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/cluster/patroni/PatroniSecret.java

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.jooq.impl.DSL;
3838
import org.jooq.lambda.tuple.Tuple;
3939
import org.jooq.lambda.tuple.Tuple2;
40+
import org.jooq.lambda.tuple.Tuple3;
4041

4142
@Singleton
4243
@OperatorVersionBinder
@@ -199,40 +200,61 @@ private void setAuthenticatorCredentials(
199200
StackGresClusterContext context,
200201
Map<String, String> previousSecretData,
201202
Map<String, String> data) {
202-
final String authenticatorUsername = context.getAuthenticatorUsername()
203-
.orElse(previousSecretData
204-
.getOrDefault(AUTHENTICATOR_USERNAME_KEY, previousSecretData
205-
.getOrDefault(AUTHENTICATOR_USERNAME_ENV, AUTHENTICATOR_USERNAME)));
206-
data.put(AUTHENTICATOR_USERNAME_KEY, authenticatorUsername);
207-
data.put(AUTHENTICATOR_USERNAME_ENV, authenticatorUsername);
208-
final String authenticatorPasswordEnv = AUTHENTICATOR_PASSWORD_ENV
209-
.replace(AUTHENTICATOR_USERNAME, authenticatorUsername);
210-
final String authenticatorOptionsEnv = AUTHENTICATOR_OPTIONS_ENV
211-
.replace(AUTHENTICATOR_USERNAME, authenticatorUsername);
212-
final String authenticatorPassword = context.getAuthenticatorPassword()
213-
.orElse(previousSecretData
214-
.getOrDefault(AUTHENTICATOR_PASSWORD_KEY, previousSecretData
215-
.getOrDefault(authenticatorPasswordEnv,
216-
context.getGeneratedAuthenticatorPassword())));
217-
data.put(AUTHENTICATOR_PASSWORD_KEY, authenticatorPassword);
218-
data.put(authenticatorPasswordEnv, context.getAuthenticatorPassword()
203+
var authenticatorCredentials = getAuthenticatorCredentials(context, previousSecretData);
204+
data.put(AUTHENTICATOR_USERNAME_KEY, authenticatorCredentials.v1);
205+
data.put(AUTHENTICATOR_USERNAME_ENV, authenticatorCredentials.v1);
206+
data.put(AUTHENTICATOR_PASSWORD_KEY, authenticatorCredentials.v2);
207+
data.put(authenticatorCredentials.v3, context.getAuthenticatorPassword()
219208
.orElse(data.get(AUTHENTICATOR_PASSWORD_KEY)));
209+
final String authenticatorOptionsEnv = AUTHENTICATOR_OPTIONS_ENV
210+
.replace(AUTHENTICATOR_USERNAME, authenticatorCredentials.v1);
220211
data.put(authenticatorOptionsEnv, "SUPERUSER");
221212
data.put(
222213
ROLES_UPDATE_SQL_KEY,
223214
Optional.ofNullable(data.get(ROLES_UPDATE_SQL_KEY)).orElse("") + "\n"
224215
+ "DO $$\n"
225216
+ "BEGIN\n"
226-
+ " IF NOT EXISTS (SELECT * FROM pg_roles WHERE rolname = " + DSL.inline(authenticatorUsername) + ") THEN\n"
227-
+ " CREATE USER " + DSL.quotedName(authenticatorUsername)
228-
+ " WITH SUPERUSER PASSWORD " + DSL.inline(authenticatorPassword) + ";\n"
217+
+ " IF NOT EXISTS (SELECT * FROM pg_roles WHERE rolname = "
218+
+ DSL.inline(authenticatorCredentials.v1) + ") THEN\n"
219+
+ " CREATE USER " + DSL.quotedName(authenticatorCredentials.v1)
220+
+ " WITH SUPERUSER PASSWORD " + DSL.inline(authenticatorCredentials.v2) + ";\n"
229221
+ " ELSE\n"
230-
+ " ALTER ROLE " + DSL.quotedName(authenticatorUsername)
231-
+ " WITH SUPERUSER PASSWORD " + DSL.inline(authenticatorPassword) + ";\n"
222+
+ " ALTER ROLE " + DSL.quotedName(authenticatorCredentials.v1)
223+
+ " WITH SUPERUSER PASSWORD " + DSL.inline(authenticatorCredentials.v2) + ";\n"
232224
+ " END IF;\n"
233225
+ "END$$;");
234226
}
235227

228+
public static Tuple3<String, String, String> getAuthenticatorCredentials(
229+
StackGresClusterContext context) {
230+
final Map<String, String> previousSecretData = context.getDatabaseSecret()
231+
.map(Secret::getData)
232+
.map(ResourceUtil::decodeSecret)
233+
.orElse(Map.of());
234+
235+
return getAuthenticatorCredentials(context, previousSecretData);
236+
}
237+
238+
private static Tuple3<String, String, String> getAuthenticatorCredentials(
239+
StackGresClusterContext context,
240+
Map<String, String> previousSecretData) {
241+
final String authenticatorUsername = context.getAuthenticatorUsername()
242+
.orElse(previousSecretData
243+
.getOrDefault(AUTHENTICATOR_USERNAME_KEY, previousSecretData
244+
.getOrDefault(AUTHENTICATOR_USERNAME_ENV, AUTHENTICATOR_USERNAME)));
245+
final String authenticatorPasswordEnv = AUTHENTICATOR_PASSWORD_ENV
246+
.replace(AUTHENTICATOR_USERNAME, authenticatorUsername);
247+
final String authenticatorPassword = context.getAuthenticatorPassword()
248+
.orElse(previousSecretData
249+
.getOrDefault(AUTHENTICATOR_PASSWORD_KEY, previousSecretData
250+
.getOrDefault(authenticatorPasswordEnv,
251+
context.getGeneratedAuthenticatorPassword())));
252+
return Tuple.tuple(
253+
authenticatorUsername,
254+
authenticatorPassword,
255+
authenticatorPasswordEnv);
256+
}
257+
236258
private void setBabelfishCredentials(
237259
StackGresClusterContext context,
238260
final Map<String, String> previousSecretData,

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/cluster/sidecars/pooling/PgBouncerPooling.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ private String getPgBouncerSection(
290290
parameters.put("listen_addr", isEnvoyDisabled ? "0.0.0.0,::" : "127.0.0.1,::1");
291291
parameters.put("listen_port", String.valueOf(EnvoyUtil.PG_POOL_PORT));
292292
parameters.put("unix_socket_dir", ClusterPath.PG_RUN_PATH.path());
293+
var credentials = PatroniSecret.getAuthenticatorCredentials(context);
294+
parameters.put("auth_user", credentials.v1);
293295
parameters.put("auth_file", ClusterPath.PGBOUNCER_AUTH_FILE_PATH.path());
294296
if (Optional.of(context.getSource())
295297
.map(StackGresCluster::getSpec)

stackgres-k8s/src/operator/src/main/resources/pgbouncer-default-values.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ max_db_connections=0
55
max_user_connections=0
66

77
auth_type=md5
8-
auth_user=authenticator
98
auth_query=SELECT usename, passwd FROM pg_shadow WHERE usename=$1
109

1110
admin_users=pgbouncer_admin

0 commit comments

Comments
 (0)