@@ -17,44 +17,16 @@ limitations under the License.
17
17
package specs
18
18
19
19
import (
20
+ "golang.org/x/exp/slices"
20
21
rbacv1 "k8s.io/api/rbac/v1"
21
22
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22
23
23
24
apiv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1"
25
+ "github.com/cloudnative-pg/cloudnative-pg/pkg/stringset"
24
26
)
25
27
26
28
// CreateRole create a role with the permissions needed by the instance manager
27
29
func CreateRole (cluster apiv1.Cluster , backupOrigin * apiv1.Backup ) rbacv1.Role {
28
- involvedSecretNames := []string {
29
- cluster .GetReplicationSecretName (),
30
- cluster .GetClientCASecretName (),
31
- cluster .GetServerCASecretName (),
32
- cluster .GetServerTLSSecretName (),
33
- cluster .GetApplicationSecretName (),
34
- cluster .GetSuperuserSecretName (),
35
- cluster .GetLDAPSecretName (),
36
- }
37
-
38
- involvedConfigMapNames := []string {
39
- cluster .Name ,
40
- }
41
-
42
- if cluster .Spec .Monitoring != nil {
43
- // If custom queries are used, the instance manager need privileges to read those
44
- // entries
45
- for _ , secretName := range cluster .Spec .Monitoring .CustomQueriesSecret {
46
- involvedSecretNames = append (involvedSecretNames , secretName .Name )
47
- }
48
-
49
- for _ , configMapName := range cluster .Spec .Monitoring .CustomQueriesConfigMap {
50
- involvedConfigMapNames = append (involvedConfigMapNames , configMapName .Name )
51
- }
52
- }
53
-
54
- involvedSecretNames = append (involvedSecretNames , backupSecrets (cluster , backupOrigin )... )
55
- involvedSecretNames = append (involvedSecretNames , externalClusterSecrets (cluster )... )
56
- involvedSecretNames = append (involvedSecretNames , managedRolesSecrets (cluster )... )
57
-
58
30
rules := []rbacv1.PolicyRule {
59
31
{
60
32
APIGroups : []string {
@@ -67,7 +39,7 @@ func CreateRole(cluster apiv1.Cluster, backupOrigin *apiv1.Backup) rbacv1.Role {
67
39
"get" ,
68
40
"watch" ,
69
41
},
70
- ResourceNames : involvedConfigMapNames ,
42
+ ResourceNames : getInvolvedConfigMapNames ( cluster ) ,
71
43
},
72
44
{
73
45
APIGroups : []string {
@@ -80,7 +52,7 @@ func CreateRole(cluster apiv1.Cluster, backupOrigin *apiv1.Backup) rbacv1.Role {
80
52
"get" ,
81
53
"watch" ,
82
54
},
83
- ResourceNames : involvedSecretNames ,
55
+ ResourceNames : getInvolvedSecretNames ( cluster , backupOrigin ) ,
84
56
},
85
57
{
86
58
APIGroups : []string {
@@ -164,6 +136,55 @@ func CreateRole(cluster apiv1.Cluster, backupOrigin *apiv1.Backup) rbacv1.Role {
164
136
}
165
137
}
166
138
139
+ func getInvolvedSecretNames (cluster apiv1.Cluster , backupOrigin * apiv1.Backup ) []string {
140
+ involvedSecretNames := []string {
141
+ cluster .GetReplicationSecretName (),
142
+ cluster .GetClientCASecretName (),
143
+ cluster .GetServerCASecretName (),
144
+ cluster .GetServerTLSSecretName (),
145
+ cluster .GetApplicationSecretName (),
146
+ cluster .GetSuperuserSecretName (),
147
+ cluster .GetLDAPSecretName (),
148
+ }
149
+
150
+ if cluster .Spec .Monitoring != nil {
151
+ for _ , secretName := range cluster .Spec .Monitoring .CustomQueriesSecret {
152
+ involvedSecretNames = append (involvedSecretNames , secretName .Name )
153
+ }
154
+ }
155
+
156
+ involvedSecretNames = append (involvedSecretNames , backupSecrets (cluster , backupOrigin )... )
157
+ involvedSecretNames = append (involvedSecretNames , externalClusterSecrets (cluster )... )
158
+ involvedSecretNames = append (involvedSecretNames , managedRolesSecrets (cluster )... )
159
+
160
+ return cleanupResourceList (involvedSecretNames )
161
+ }
162
+
163
+ func getInvolvedConfigMapNames (cluster apiv1.Cluster ) []string {
164
+ involvedConfigMapNames := []string {
165
+ cluster .Name ,
166
+ }
167
+
168
+ if cluster .Spec .Monitoring != nil {
169
+ // If custom queries are used, the instance manager need privileges to read those
170
+ // entries
171
+ for _ , configMapName := range cluster .Spec .Monitoring .CustomQueriesConfigMap {
172
+ involvedConfigMapNames = append (involvedConfigMapNames , configMapName .Name )
173
+ }
174
+ }
175
+
176
+ return cleanupResourceList (involvedConfigMapNames )
177
+ }
178
+
179
+ // cleanupResourceList returns a new list with the same elements as resourceList, where
180
+ // the empty and duplicate entries have been removed
181
+ func cleanupResourceList (resourceList []string ) []string {
182
+ result := stringset .From (resourceList ).ToSortedList ()
183
+ return slices .DeleteFunc (result , func (s string ) bool {
184
+ return len (s ) == 0
185
+ })
186
+ }
187
+
167
188
func externalClusterSecrets (cluster apiv1.Cluster ) []string {
168
189
var result []string
169
190
0 commit comments