Various fixes
Sync pool user correctly, without overriding it. Fix numberOfInstances comparison in defaults. Fix maxDBConnections usage.
This commit is contained in:
parent
ab118dd78b
commit
80fee17ea4
|
|
@ -860,7 +860,6 @@ func (c *Cluster) initSystemUsers() {
|
||||||
// Connection pool user is an exception, if requested it's going to be
|
// Connection pool user is an exception, if requested it's going to be
|
||||||
// created by operator as a normal pgUser
|
// created by operator as a normal pgUser
|
||||||
if c.needConnectionPool() {
|
if c.needConnectionPool() {
|
||||||
|
|
||||||
// initialize empty connection pool if not done yet
|
// initialize empty connection pool if not done yet
|
||||||
if c.Spec.ConnectionPool == nil {
|
if c.Spec.ConnectionPool == nil {
|
||||||
c.Spec.ConnectionPool = &acidv1.ConnectionPool{}
|
c.Spec.ConnectionPool = &acidv1.ConnectionPool{}
|
||||||
|
|
@ -870,11 +869,21 @@ func (c *Cluster) initSystemUsers() {
|
||||||
c.Spec.ConnectionPool.User,
|
c.Spec.ConnectionPool.User,
|
||||||
c.OpConfig.ConnectionPool.User)
|
c.OpConfig.ConnectionPool.User)
|
||||||
|
|
||||||
c.systemUsers[constants.ConnectionPoolUserKeyName] = spec.PgUser{
|
// connection pooler application should be able to login with this role
|
||||||
|
connPoolUser := spec.PgUser{
|
||||||
Origin: spec.RoleConnectionPool,
|
Origin: spec.RoleConnectionPool,
|
||||||
Name: username,
|
Name: username,
|
||||||
|
Flags: []string{constants.RoleFlagLogin},
|
||||||
Password: util.RandomPassword(constants.PasswordLength),
|
Password: util.RandomPassword(constants.PasswordLength),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, exists := c.pgUsers[username]; !exists {
|
||||||
|
c.pgUsers[username] = connPoolUser
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, exists := c.systemUsers[constants.ConnectionPoolUserKeyName]; !exists {
|
||||||
|
c.systemUsers[constants.ConnectionPoolUserKeyName] = connPoolUser
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1256,12 +1265,16 @@ func (c *Cluster) needSyncConnPoolDefaults(
|
||||||
podTemplate := deployment.Spec.Template
|
podTemplate := deployment.Spec.Template
|
||||||
poolContainer := podTemplate.Spec.Containers[constants.ConnPoolContainer]
|
poolContainer := podTemplate.Spec.Containers[constants.ConnPoolContainer]
|
||||||
|
|
||||||
|
if spec == nil {
|
||||||
|
spec = &acidv1.ConnectionPool{}
|
||||||
|
}
|
||||||
|
|
||||||
if spec.NumberOfInstances == nil &&
|
if spec.NumberOfInstances == nil &&
|
||||||
deployment.Spec.Replicas != config.NumberOfInstances {
|
*deployment.Spec.Replicas != *config.NumberOfInstances {
|
||||||
|
|
||||||
sync = true
|
sync = true
|
||||||
msg := fmt.Sprintf("NumberOfInstances is different (%d vs %d)",
|
msg := fmt.Sprintf("NumberOfInstances is different (%d vs %d)",
|
||||||
deployment.Spec.Replicas, config.NumberOfInstances)
|
*deployment.Spec.Replicas, *config.NumberOfInstances)
|
||||||
reasons = append(reasons, msg)
|
reasons = append(reasons, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1803,7 +1803,7 @@ func (c *Cluster) getConnPoolEnvVars(spec *acidv1.PostgresSpec) []v1.EnvVar {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "CONNECTION_POOL_MAX_DB_CONN",
|
Name: "CONNECTION_POOL_MAX_DB_CONN",
|
||||||
Value: fmt.Sprint(effectiveMaxDBConn),
|
Value: fmt.Sprint(maxDBConn),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -413,12 +413,18 @@ func (c *Cluster) syncSecrets() error {
|
||||||
} else if secretUsername == c.systemUsers[constants.ReplicationUserKeyName].Name {
|
} else if secretUsername == c.systemUsers[constants.ReplicationUserKeyName].Name {
|
||||||
secretUsername = constants.ReplicationUserKeyName
|
secretUsername = constants.ReplicationUserKeyName
|
||||||
userMap = c.systemUsers
|
userMap = c.systemUsers
|
||||||
|
} else if secretUsername == c.systemUsers[constants.ConnectionPoolUserKeyName].Name {
|
||||||
|
secretUsername = constants.ConnectionPoolUserKeyName
|
||||||
|
userMap = c.systemUsers
|
||||||
} else {
|
} else {
|
||||||
userMap = c.pgUsers
|
userMap = c.pgUsers
|
||||||
}
|
}
|
||||||
pwdUser := userMap[secretUsername]
|
pwdUser := userMap[secretUsername]
|
||||||
// if this secret belongs to the infrastructure role and the password has changed - replace it in the secret
|
// if this secret belongs to the infrastructure role and the password has changed - replace it in the secret
|
||||||
if pwdUser.Password != string(secret.Data["password"]) && pwdUser.Origin == spec.RoleOriginInfrastructure {
|
if pwdUser.Password != string(secret.Data["password"]) &&
|
||||||
|
(pwdUser.Origin == spec.RoleOriginInfrastructure ||
|
||||||
|
pwdUser.Origin == spec.RoleConnectionPool) {
|
||||||
|
|
||||||
c.logger.Debugf("updating the secret %q from the infrastructure roles", secretSpec.Name)
|
c.logger.Debugf("updating the secret %q from the infrastructure roles", secretSpec.Name)
|
||||||
if _, err = c.KubeClient.Secrets(secretSpec.Namespace).Update(secretSpec); err != nil {
|
if _, err = c.KubeClient.Secrets(secretSpec.Namespace).Update(secretSpec); err != nil {
|
||||||
return fmt.Errorf("could not update infrastructure role secret for role %q: %v", secretUsername, err)
|
return fmt.Errorf("could not update infrastructure role secret for role %q: %v", secretUsername, err)
|
||||||
|
|
@ -466,6 +472,7 @@ func (c *Cluster) syncRoles() (err error) {
|
||||||
if c.needConnectionPool() {
|
if c.needConnectionPool() {
|
||||||
connPoolUser := c.systemUsers[constants.ConnectionPoolUserKeyName]
|
connPoolUser := c.systemUsers[constants.ConnectionPoolUserKeyName]
|
||||||
userNames = append(userNames, connPoolUser.Name)
|
userNames = append(userNames, connPoolUser.Name)
|
||||||
|
c.pgUsers[connPoolUser.Name] = connPoolUser
|
||||||
}
|
}
|
||||||
|
|
||||||
dbUsers, err = c.readPgUsersFromDatabase(userNames)
|
dbUsers, err = c.readPgUsersFromDatabase(userNames)
|
||||||
|
|
@ -473,20 +480,6 @@ func (c *Cluster) syncRoles() (err error) {
|
||||||
return fmt.Errorf("error getting users from the database: %v", err)
|
return fmt.Errorf("error getting users from the database: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.needConnectionPool() {
|
|
||||||
connPoolUser := c.systemUsers[constants.ConnectionPoolUserKeyName]
|
|
||||||
|
|
||||||
// An exception from system users, connection pool user should be
|
|
||||||
// created by operator, but never updated. If connection pool user
|
|
||||||
// already exist, do not update it.
|
|
||||||
if _, exist := dbUsers[connPoolUser.Name]; exist {
|
|
||||||
delete(dbUsers, connPoolUser.Name)
|
|
||||||
delete(c.pgUsers, connPoolUser.Name)
|
|
||||||
} else {
|
|
||||||
c.pgUsers[connPoolUser.Name] = connPoolUser
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pgSyncRequests := c.userSyncStrategy.ProduceSyncRequests(dbUsers, c.pgUsers)
|
pgSyncRequests := c.userSyncStrategy.ProduceSyncRequests(dbUsers, c.pgUsers)
|
||||||
if err = c.userSyncStrategy.ExecuteSyncRequests(pgSyncRequests, c.pgDb); err != nil {
|
if err = c.userSyncStrategy.ExecuteSyncRequests(pgSyncRequests, c.pgDb); err != nil {
|
||||||
return fmt.Errorf("error executing sync statements: %v", err)
|
return fmt.Errorf("error executing sync statements: %v", err)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue