Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix syncSecrets and remove pooler secret
  • Loading branch information
FxKu committed Aug 10, 2020
commit 521c27ffc8da9113e31ef71838066ae62614b93b
2 changes: 1 addition & 1 deletion pkg/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func New(cfg Config, kubeClient k8sutil.KubernetesClient, pgSpec acidv1.Postgres

return fmt.Sprintf("%s-%s", e.PodName, e.ResourceVersion), nil
})
password_encryption, ok := pgSpec.Spec.PostgresqlParam.Parameters["password_encryption"]
password_encryption, ok := pgSpec.Spec.PostgresqlParam.Parameters["password_encryption"]
if !ok {
password_encryption = "md5"
}
Expand Down
49 changes: 42 additions & 7 deletions pkg/cluster/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"

"github.com/zalando/postgres-operator/pkg/spec"
"github.com/zalando/postgres-operator/pkg/util"
"github.com/zalando/postgres-operator/pkg/util/constants"
"github.com/zalando/postgres-operator/pkg/util/k8sutil"
"github.com/zalando/postgres-operator/pkg/util/retryutil"
)
Expand Down Expand Up @@ -207,8 +209,6 @@ func (c *Cluster) deleteConnectionPooler() (err error) {
serviceName = service.Name
}

// set delete propagation policy to foreground, so that all the dependant
// will be deleted.
err = c.KubeClient.
Services(c.Namespace).
Delete(context.TODO(), serviceName, options)
Expand All @@ -221,6 +221,29 @@ func (c *Cluster) deleteConnectionPooler() (err error) {

c.logger.Infof("Connection pooler service %q has been deleted", serviceName)

// Repeat the same for the secret object
connectionPoolerUser := spec.PgUser{
Origin: spec.RoleConnectionPooler,
Name: c.OpConfig.ConnectionPooler.User,
Flags: []string{constants.RoleFlagLogin},
Password: util.RandomPassword(constants.PasswordLength),
}

secretTemplate := c.generateSingleUserSecret(c.Namespace, connectionPoolerUser)
secret, err := c.KubeClient.
Secrets(c.Namespace).
Get(context.TODO(), secretTemplate.Name, metav1.GetOptions{})

if err != nil {
c.logger.Debugf("could not get connection pooler secret %q: %v", secretTemplate.Name, err)
} else {
uid := secret.UID
if err = c.deleteSecret(uid, *secret); err != nil {
return fmt.Errorf("could not delete pooler secret: %v", err)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this prevent deletion of e.g deployment? disable pooler should cleanup as good as it gets.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nope. 1. Deployment, 2. Service, 3. Secret

It's true, however, that if 1. or 2. return an error the rest is not deleted.

}
c.Secrets[uid] = nil
}

c.ConnectionPooler = nil
return nil
}
Expand Down Expand Up @@ -730,14 +753,11 @@ func (c *Cluster) deleteSecrets() error {
var errors []string
errorCount := 0
for uid, secret := range c.Secrets {
c.logger.Debugf("deleting secret %q", util.NameFromMeta(secret.ObjectMeta))
err := c.KubeClient.Secrets(secret.Namespace).Delete(context.TODO(), secret.Name, c.deleteOptions)
err := c.deleteSecret(uid, *secret)
if err != nil {
errors = append(errors, fmt.Sprintf("could not delete secret %q: %v", util.NameFromMeta(secret.ObjectMeta), err))
errors = append(errors, fmt.Sprintf("%v", err))
errorCount++
}
c.logger.Infof("secret %q has been deleted", util.NameFromMeta(secret.ObjectMeta))
c.Secrets[uid] = nil
}

if errorCount > 0 {
Expand All @@ -747,6 +767,21 @@ func (c *Cluster) deleteSecrets() error {
return nil
}

func (c *Cluster) deleteSecret(uid types.UID, secret v1.Secret) error {
c.setProcessName("deleting secret")
c.logger.Debugf("deleting secret %q", util.NameFromMeta(secret.ObjectMeta))
err := c.KubeClient.Secrets(secret.Namespace).Delete(context.TODO(), secret.Name, c.deleteOptions)
if k8sutil.ResourceNotFound(err) {
c.logger.Debugf("Connection pooler secret was already deleted")
} else if err != nil {
return fmt.Errorf("could not delete secret %q: %v", util.NameFromMeta(secret.ObjectMeta), err)
}
c.logger.Infof("secret %q has been deleted", util.NameFromMeta(secret.ObjectMeta))
c.Secrets[uid] = nil

return nil
}

func (c *Cluster) createRoles() (err error) {
// TODO: figure out what to do with duplicate names (humans and robots) among pgUsers
return c.syncRoles()
Expand Down
1 change: 1 addition & 0 deletions pkg/cluster/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,7 @@ func (c *Cluster) syncSecrets() error {
c.logger.Warningf("secret %q does not contain the role %q", secretSpec.Name, secretUsername)
continue
}
c.Secrets[secret.UID] = secret
c.logger.Debugf("secret %q already exists, fetching its password", util.NameFromMeta(secret.ObjectMeta))
if secretUsername == c.systemUsers[constants.SuperuserKeyName].Name {
secretUsername = constants.SuperuserKeyName
Expand Down