Skip to content

Commit ab91a3b

Browse files
authored
Merge pull request #68 from cybertec-postgresql/bugfix/monitoring-user
Bugfix/monitoring user
2 parents da8ce8c + 65d272c commit ab91a3b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+120
-190
lines changed

pkg/apis/cpo.opensource.cybertec.at/v1/zz_generated.deepcopy.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/cluster/cluster.go

Lines changed: 34 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,7 @@ func New(cfg Config, kubeClient k8sutil.KubernetesClient, pgSpec cpov1.Postgresq
127127
if !ok {
128128
passwordEncryption = "scram-sha-256"
129129
}
130-
if pgSpec.Spec.Monitoring != nil {
131-
flg := cpov1.UserFlags{constants.RoleFlagLogin}
132-
if pgSpec.Spec.Users != nil {
133-
pgSpec.Spec.Users[monitorUsername] = flg
134-
} else {
135-
users := make(map[string]cpov1.UserFlags)
136-
pgSpec.Spec.Users = users
137-
pgSpec.Spec.Users[monitorUsername] = flg
138-
}
139-
}
130+
140131
cluster := &Cluster{
141132
Config: cfg,
142133
Postgresql: pgSpec,
@@ -359,12 +350,6 @@ func (c *Cluster) Create() (err error) {
359350
}
360351
c.logger.Info("a TDE secret was successfully created")
361352
}
362-
if c.Postgresql.Spec.Monitoring != nil {
363-
if err := c.createMonitoringSecret(); err != nil {
364-
return fmt.Errorf("could not create the monitoring secret: %v", err)
365-
}
366-
c.logger.Info("a monitoring secret was successfully created")
367-
}
368353

369354
if specHasPgbackrestClone(&c.Postgresql.Spec) {
370355
if err := c.createPgbackrestCloneConfig(); err != nil {
@@ -440,27 +425,8 @@ func (c *Cluster) Create() (err error) {
440425
// something fails, report warning
441426
c.createConnectionPooler(c.installLookupFunction)
442427

443-
//Setup cpo monitoring related sql statements
444428
if c.Spec.Monitoring != nil {
445-
c.logger.Info("setting up CPO monitoring")
446-
447-
// Open a new connection to the postgres db tp setup monitoring struc and permissions
448-
if err := c.initDbConnWithName("postgres"); err != nil {
449-
return fmt.Errorf("could not init database connection")
450-
}
451-
defer func() {
452-
if c.connectionIsClosed() {
453-
return
454-
}
455-
456-
if err := c.closeDbConn(); err != nil {
457-
c.logger.Errorf("could not close database connection: %v", err)
458-
}
459-
}()
460-
_, err := c.pgDb.Exec(CPOmonitoring)
461-
if err != nil {
462-
return fmt.Errorf("CPO monitoring could not be setup: %v", err)
463-
}
429+
c.addMonitoringPermissions()
464430
}
465431

466432
// remember slots to detect deletion from manifest
@@ -961,22 +927,10 @@ func (c *Cluster) Update(oldSpec, newSpec *cpov1.Postgresql) error {
961927
updateFailed = true
962928
}
963929
}
964-
//Add monitoring user if required
965-
if newSpec.Spec.Monitoring != nil {
966-
flags := []string{constants.RoleFlagLogin}
967-
monitorUser := map[string]spec.PgUser{
968-
monitorUsername: {
969-
Origin: spec.RoleOriginInfrastructure,
970-
Name: monitorUsername,
971-
Namespace: c.Namespace,
972-
Flags: flags,
973-
},
974-
}
975-
c.pgUsers[monitorUsername] = monitorUser[monitorUsername]
976-
}
977930
//Check if monitoring user is added in manifest
978931
if _, ok := newSpec.Spec.Users["cpo-exporter"]; ok {
979932
c.logger.Error("creating user of name cpo-exporter is not allowed as it is reserved for monitoring")
933+
updateFailed = true
980934
}
981935

982936
// Users
@@ -990,11 +944,14 @@ func (c *Cluster) Update(oldSpec, newSpec *cpov1.Postgresql) error {
990944
// only when disabled in oldSpec and enabled in newSpec
991945
needPoolerUser := c.needConnectionPoolerUser(&oldSpec.Spec, &newSpec.Spec)
992946

947+
// Check if Monitor-User needs to be created
948+
needMonitoring := newSpec.Spec.Monitoring != nil && oldSpec.Spec.Monitoring == nil
949+
993950
// streams new replication user created who is initialized in initUsers
994951
// only when streams were not specified in oldSpec but in newSpec
995952
needStreamUser := len(oldSpec.Spec.Streams) == 0 && len(newSpec.Spec.Streams) > 0
996953

997-
if !sameUsers || !sameRotatedUsers || needPoolerUser || needStreamUser {
954+
if !sameUsers || !sameRotatedUsers || needPoolerUser || needMonitoring || needStreamUser {
998955
c.logger.Debugf("initialize users")
999956
if err := c.initUsers(); err != nil {
1000957
c.logger.Errorf("could not init users - skipping sync of secrets and databases: %v", err)
@@ -1024,12 +981,6 @@ func (c *Cluster) Update(oldSpec, newSpec *cpov1.Postgresql) error {
1024981
syncStatefulSet = true
1025982
}
1026983

1027-
//sync monitoring container
1028-
if !reflect.DeepEqual(oldSpec.Spec.Monitoring, newSpec.Spec.Monitoring) {
1029-
syncStatefulSet = true
1030-
c.syncMonitoringSecret(oldSpec, newSpec)
1031-
}
1032-
1033984
//sync sts when there is a change in the pgbackrest secret, since we need to mount this
1034985
if newSpec.Spec.Backup != nil && oldSpec.Spec.Backup != nil &&
1035986
newSpec.Spec.Backup.Pgbackrest != nil && oldSpec.Spec.Backup.Pgbackrest != nil &&
@@ -1213,6 +1164,17 @@ func (c *Cluster) Update(oldSpec, newSpec *cpov1.Postgresql) error {
12131164
updateFailed = true
12141165
}
12151166

1167+
// Check if we need to call addMonitoringPermissions-func
1168+
if c.Spec.Monitoring != nil && newSpec.Spec.Monitoring != nil && oldSpec.Spec.Monitoring == nil {
1169+
c.addMonitoringPermissions()
1170+
}
1171+
// Check if Monitoring-Secret needs to be removed
1172+
if newSpec.Spec.Monitoring == nil && oldSpec.Spec.Monitoring != nil {
1173+
if err := c.deleteMonitoringSecret(); err != nil {
1174+
return fmt.Errorf("could not remove the Monitoring secret: %v", err)
1175+
}
1176+
}
1177+
12161178
// streams
12171179
if len(newSpec.Spec.Streams) > 0 {
12181180
if err := c.syncStreams(); err != nil {
@@ -1460,6 +1422,22 @@ func (c *Cluster) initSystemUsers() error {
14601422
}
14611423
}
14621424

1425+
// if the monitor object has been created, a monitoring user is required.
1426+
if c.Spec.Monitoring != nil {
1427+
1428+
MonitoringUser := spec.PgUser{
1429+
Origin: spec.RoleMonitoring,
1430+
Name: constants.MonitoringUserKeyName,
1431+
Namespace: c.Namespace,
1432+
Flags: []string{constants.RoleFlagLogin},
1433+
Password: util.RandomPassword(constants.PasswordLength),
1434+
}
1435+
1436+
if _, exists := c.systemUsers[constants.MonitoringUserKeyName]; !exists {
1437+
c.systemUsers[constants.MonitoringUserKeyName] = MonitoringUser
1438+
}
1439+
}
1440+
14631441
// replication users for event streams are another exception
14641442
// the operator will create one replication user for all streams
14651443
if len(c.Spec.Streams) > 0 {

pkg/cluster/cluster_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"strings"
88
"testing"
99

10-
"github.com/sirupsen/logrus"
11-
"github.com/stretchr/testify/assert"
1210
cpov1 "github.com/cybertec-postgresql/cybertec-pg-operator/pkg/apis/cpo.opensource.cybertec.at/v1"
1311
fakecpov1 "github.com/cybertec-postgresql/cybertec-pg-operator/pkg/generated/clientset/versioned/fake"
1412
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/spec"
@@ -17,6 +15,8 @@ import (
1715
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util/constants"
1816
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util/k8sutil"
1917
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util/teams"
18+
"github.com/sirupsen/logrus"
19+
"github.com/stretchr/testify/assert"
2020
v1 "k8s.io/api/core/v1"
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2222
"k8s.io/client-go/kubernetes/fake"
@@ -944,16 +944,20 @@ func TestServiceAnnotations(t *testing.T) {
944944
}
945945

946946
func TestInitSystemUsers(t *testing.T) {
947-
// reset system users, pooler and stream section
947+
// reset system users, pooler, monitoring and stream section
948948
cl.systemUsers = make(map[string]spec.PgUser)
949949
cl.Spec.EnableConnectionPooler = boolToPointer(false)
950+
cl.Spec.Monitoring = nil
950951
cl.Spec.Streams = []cpov1.Stream{}
951952

952-
// default cluster without connection pooler and event streams
953+
// default cluster without connection pooler, monitoring and event streams
953954
cl.initSystemUsers()
954955
if _, exist := cl.systemUsers[constants.ConnectionPoolerUserKeyName]; exist {
955956
t.Errorf("%s, connection pooler user is present", t.Name())
956957
}
958+
if _, exist := cl.systemUsers[constants.MonitoringUserKeyName]; exist {
959+
t.Errorf("%s, Monitoring user is present", t.Name())
960+
}
957961
if _, exist := cl.systemUsers[constants.EventStreamUserKeyName]; exist {
958962
t.Errorf("%s, stream user is present", t.Name())
959963
}

pkg/cluster/database.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ const (
8989
TO {{.pooler_user}};
9090
GRANT USAGE ON SCHEMA {{.pooler_schema}} TO {{.pooler_user}};
9191
`
92-
CPOmonitoring = `
92+
93+
cpoMonitoring = `
9394
GRANT pg_monitor TO cpo_exporter;
9495
GRANT SELECT ON TABLE pg_authid TO cpo_exporter;
9596
@@ -793,3 +794,27 @@ func (c *Cluster) installLookupFunction(poolerSchema, poolerUser string) error {
793794

794795
return nil
795796
}
797+
798+
// Creates the needes structure and grant needed permissions for the Monitoring
799+
func (c *Cluster) addMonitoringPermissions() error {
800+
c.logger.Info("setting up CPO monitoring")
801+
802+
// Open a new connection to the postgres db tp setup monitoring struc and permissions
803+
if err := c.initDbConnWithName("postgres"); err != nil {
804+
return fmt.Errorf("could not init database connection")
805+
}
806+
defer func() {
807+
if c.connectionIsClosed() {
808+
return
809+
}
810+
811+
if err := c.closeDbConn(); err != nil {
812+
c.logger.Errorf("could not close database connection: %v", err)
813+
}
814+
}()
815+
_, err := c.pgDb.Exec(cpoMonitoring)
816+
if err != nil {
817+
return fmt.Errorf("CPO monitoring could not be setup: %v", err)
818+
}
819+
return nil
820+
}

pkg/cluster/resources.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515

1616
cpov1 "github.com/cybertec-postgresql/cybertec-pg-operator/pkg/apis/cpo.opensource.cybertec.at/v1"
1717
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util"
18-
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util/constants"
1918
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util/k8sutil"
2019
"github.com/cybertec-postgresql/cybertec-pg-operator/pkg/util/retryutil"
2120
)
@@ -95,16 +94,6 @@ func (c *Cluster) createStatefulSet() (*appsv1.StatefulSet, error) {
9594
Env: c.generateMonitoringEnvVars(),
9695
}
9796
c.Spec.Sidecars = append(c.Spec.Sidecars, *sidecar) //populate the sidecar spec so that the sidecar is automatically created
98-
99-
//Add monitoring user
100-
flg := cpov1.UserFlags{constants.RoleFlagLogin}
101-
if c.Spec.Users != nil {
102-
c.Spec.Users[monitorUsername] = flg
103-
} else {
104-
users := make(map[string]cpov1.UserFlags)
105-
c.Spec.Users = users
106-
c.Spec.Users[monitorUsername] = flg
107-
}
10897
}
10998

11099
statefulSetSpec, err := c.generateStatefulSet(&c.Spec)

pkg/cluster/sync.go

Lines changed: 7 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,6 @@ func (c *Cluster) Sync(newSpec *cpov1.Postgresql) error {
192192
return fmt.Errorf("error refreshing restore configmap: %v", err)
193193
}
194194

195-
// sync monitoring
196-
if err = c.syncMonitoringSecret(&oldSpec, newSpec); err != nil {
197-
return fmt.Errorf("could not sync monitoring: %v", err)
198-
}
199-
200195
if err = c.initUsers(); err != nil {
201196
err = fmt.Errorf("could not init users: %v", err)
202197
return err
@@ -1032,6 +1027,13 @@ func (c *Cluster) updateSecret(
10321027
userMap = c.systemUsers
10331028
}
10341029
}
1030+
// use system user when Monitoring is enabled and Monitoring user is specfied in manifest
1031+
if _, exists := c.systemUsers[constants.MonitoringUserKeyName]; exists {
1032+
if secretUsername == c.systemUsers[constants.MonitoringUserKeyName].Name {
1033+
userKey = constants.MonitoringUserKeyName
1034+
userMap = c.systemUsers
1035+
}
1036+
}
10351037
// use system user when streams are defined and fes_user is specfied in manifest
10361038
if _, exists := c.systemUsers[constants.EventStreamUserKeyName]; exists {
10371039
if secretUsername == c.systemUsers[constants.EventStreamUserKeyName].Name {
@@ -1682,37 +1684,6 @@ func (c *Cluster) createTDESecret() error {
16821684
return nil
16831685
}
16841686

1685-
func (c *Cluster) createMonitoringSecret() error {
1686-
c.logger.Info("creating Monitoring secret")
1687-
c.setProcessName("creating Monitoring secret")
1688-
generatedKey := make([]byte, 16)
1689-
rand.Read(generatedKey)
1690-
1691-
generatedSecret := v1.Secret{
1692-
ObjectMeta: metav1.ObjectMeta{
1693-
Name: c.getMonitoringSecretName(),
1694-
Namespace: c.Namespace,
1695-
Labels: c.labelsSet(true),
1696-
},
1697-
Type: v1.SecretTypeOpaque,
1698-
Data: map[string][]byte{
1699-
"username": []byte(monitorUsername),
1700-
"password": []byte(fmt.Sprintf("%x", generatedKey)),
1701-
},
1702-
}
1703-
secret, err := c.KubeClient.Secrets(generatedSecret.Namespace).Create(context.TODO(), &generatedSecret, metav1.CreateOptions{})
1704-
if err == nil {
1705-
c.Secrets[secret.UID] = secret
1706-
c.logger.Debugf("created new secret %s, namespace: %s, uid: %s", util.NameFromMeta(secret.ObjectMeta), generatedSecret.Namespace, secret.UID)
1707-
} else {
1708-
if !k8sutil.ResourceAlreadyExists(err) {
1709-
return fmt.Errorf("could not create secret for Monitoring %s: in namespace %s: %v", util.NameFromMeta(secret.ObjectMeta), generatedSecret.Namespace, err)
1710-
}
1711-
}
1712-
1713-
return nil
1714-
}
1715-
17161687
// delete monitoring secret
17171688
func (c *Cluster) deleteMonitoringSecret() (err error) {
17181689
// Repeat the same for the secret object
@@ -1732,47 +1703,6 @@ func (c *Cluster) deleteMonitoringSecret() (err error) {
17321703
return nil
17331704
}
17341705

1735-
// Sync monitoring
1736-
// In case of monitoring is added/deleted, we need to
1737-
// 1. Update sts to in/exclude the exporter contianer
1738-
// 2. Add/Delete the respective user
1739-
// 3. Add/Delete the respective secret
1740-
func (c *Cluster) syncMonitoringSecret(oldSpec, newSpec *cpov1.Postgresql) error {
1741-
c.logger.Info("syncing Monitoring secret")
1742-
c.setProcessName("syncing Monitoring secret")
1743-
1744-
if newSpec.Spec.Monitoring != nil && oldSpec.Spec.Monitoring == nil {
1745-
// Create monitoring secret
1746-
if err := c.createMonitoringSecret(); err != nil {
1747-
return fmt.Errorf("could not create the monitoring secret: %v", err)
1748-
} else {
1749-
flags := []string{constants.RoleFlagLogin}
1750-
monitorUser := map[string]spec.PgUser{
1751-
monitorUsername: {
1752-
Origin: spec.RoleOriginInfrastructure,
1753-
Name: monitorUsername,
1754-
Namespace: c.Namespace,
1755-
Flags: flags,
1756-
},
1757-
}
1758-
c.pgUsers[monitorUsername] = monitorUser[monitorUsername]
1759-
}
1760-
c.logger.Info("monitoring secret was successfully created")
1761-
} else if newSpec.Spec.Monitoring == nil && oldSpec.Spec.Monitoring != nil {
1762-
// Delete the monitoring secret
1763-
if err := c.deleteMonitoringSecret(); err != nil {
1764-
return fmt.Errorf("could not delete the monitoring secret: %v", err)
1765-
} else {
1766-
// Delete the monitoring user
1767-
monitorUser := c.pgUsers[monitorUsername]
1768-
monitorUser.Deleted = true
1769-
c.pgUsers[monitorUsername] = monitorUser
1770-
}
1771-
c.logger.Info("monitoring secret was successfully deleted")
1772-
}
1773-
return nil
1774-
}
1775-
17761706
func generateRootCertificate(
17771707
privateKey *ecdsa.PrivateKey, serialNumber *big.Int,
17781708
) (*x509.Certificate, error) {

pkg/generated/clientset/versioned/clientset.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/generated/clientset/versioned/doc.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/generated/clientset/versioned/fake/clientset_generated.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)