@@ -6,9 +6,11 @@ import (
6
6
"strings"
7
7
8
8
crd "github.com/RedHatInsights/clowder/apis/cloud.redhat.com/v1alpha1"
9
+ "github.com/RedHatInsights/clowder/controllers/cloud.redhat.com/config"
9
10
"github.com/RedHatInsights/clowder/controllers/cloud.redhat.com/errors"
10
11
obj "github.com/RedHatInsights/clowder/controllers/cloud.redhat.com/object"
11
12
"github.com/RedHatInsights/clowder/controllers/cloud.redhat.com/providers"
13
+ "github.com/RedHatInsights/clowder/controllers/cloud.redhat.com/providers/sizing"
12
14
provutils "github.com/RedHatInsights/clowder/controllers/cloud.redhat.com/providers/utils"
13
15
14
16
rc "github.com/RedHatInsights/rhc-osdk-utils/resourceCache"
@@ -38,6 +40,113 @@ var WebKeycloakImportSecret = rc.NewSingleResourceIdent(ProvName, "web_keycloak_
38
40
// WebKeycloakSecret is the mocked secret config
39
41
var WebKeycloakSecret = rc .NewSingleResourceIdent (ProvName , "web_keycloak_secret" , & core.Secret {}, rc.ResourceOptions {WriteNow : true })
40
42
43
+ // WebKeycloakDBDeployment is the ident referring to the local Feature Flags DB deployment object.
44
+ var WebKeycloakDBDeployment = rc .NewSingleResourceIdent (ProvName , "web_keycloak_db_deployment" , & apps.Deployment {})
45
+
46
+ // WebKeycloakDBService is the ident referring to the local Feature Flags DB service object.
47
+ var WebKeycloakDBService = rc .NewSingleResourceIdent (ProvName , "web_keycloak_db_service" , & core.Service {})
48
+
49
+ // WebKeycloakDBPVC is the ident referring to the local Feature Flags DB PVC object.
50
+ var WebKeycloakDBPVC = rc .NewSingleResourceIdent (ProvName , "web_keycloak_db_pvc" , & core.PersistentVolumeClaim {})
51
+
52
+ // WebKeycloakDBSecret is the ident referring to the local Feature Flags DB secret object.
53
+ var WebKeycloakDBSecret = rc .NewSingleResourceIdent (ProvName , "web_keycloak_db_secret" , & core.Secret {})
54
+
55
+ func configureKeycloakDB (web * localWebProvider ) error {
56
+ namespacedNameDb := types.NamespacedName {
57
+ Name : "keycloak-db" ,
58
+ Namespace : web .Env .Status .TargetNamespace ,
59
+ }
60
+
61
+ dd := & apps.Deployment {}
62
+ if err := web .Cache .Create (WebKeycloakDBDeployment , namespacedNameDb , dd ); err != nil {
63
+ return err
64
+ }
65
+
66
+ dbCfg := config.DatabaseConfig {}
67
+
68
+ password , err := utils .RandPassword (16 , provutils .RCharSet )
69
+ if err != nil {
70
+ return errors .Wrap ("password generate failed" , err )
71
+ }
72
+
73
+ pgPassword , err := utils .RandPassword (16 , provutils .RCharSet )
74
+ if err != nil {
75
+ return errors .Wrap ("pgPassword generate failed" , err )
76
+ }
77
+
78
+ username := utils .RandString (16 )
79
+ hostname := fmt .Sprintf ("%v.%v.svc" , namespacedNameDb .Name , namespacedNameDb .Namespace )
80
+
81
+ dataInitDb := func () map [string ]string {
82
+
83
+ return map [string ]string {
84
+ "hostname" : hostname ,
85
+ "port" : "5432" ,
86
+ "username" : username ,
87
+ "password" : password ,
88
+ "pgPass" : pgPassword ,
89
+ "name" : "keycloak" ,
90
+ }
91
+ }
92
+
93
+ secMapDb , err := providers .MakeOrGetSecret (web .Env , web .Cache , WebKeycloakDBSecret , namespacedNameDb , dataInitDb )
94
+ if err != nil {
95
+ return errors .Wrap ("Couldn't set/get secret" , err )
96
+ }
97
+
98
+ err = dbCfg .Populate (secMapDb )
99
+ if err != nil {
100
+ return errors .Wrap ("couldn't convert to int" , err )
101
+ }
102
+ dbCfg .AdminUsername = "postgres"
103
+
104
+ labels := & map [string ]string {"sub" : "keycloak" }
105
+
106
+ res := core.ResourceRequirements {
107
+ Limits : core.ResourceList {
108
+ "memory" : resource .MustParse ("200Mi" ),
109
+ "cpu" : resource .MustParse ("100m" ),
110
+ },
111
+ Requests : core.ResourceList {
112
+ "memory" : resource .MustParse ("100Mi" ),
113
+ "cpu" : resource .MustParse ("50m" ),
114
+ },
115
+ }
116
+
117
+ provutils .MakeLocalDB (dd , namespacedNameDb , web .Env , labels , & dbCfg , "quay.io/cloudservices/postgresql-rds:15-53ac80c" , web .Env .Spec .Providers .Web .KeycloakPVC , "keycloak" , & res )
118
+
119
+ if err = web .Cache .Update (WebKeycloakDBDeployment , dd ); err != nil {
120
+ return err
121
+ }
122
+
123
+ s := & core.Service {}
124
+ if err := web .Cache .Create (WebKeycloakDBService , namespacedNameDb , s ); err != nil {
125
+ return err
126
+ }
127
+
128
+ provutils .MakeLocalDBService (s , namespacedNameDb , web .Env , labels )
129
+
130
+ if err = web .Cache .Update (WebKeycloakDBService , s ); err != nil {
131
+ return err
132
+ }
133
+
134
+ if web .Env .Spec .Providers .Web .KeycloakPVC {
135
+ pvc := & core.PersistentVolumeClaim {}
136
+ if err = web .Cache .Create (WebKeycloakDBPVC , namespacedNameDb , pvc ); err != nil {
137
+ return err
138
+ }
139
+
140
+ provutils .MakeLocalDBPVC (pvc , namespacedNameDb , web .Env , sizing .GetDefaultVolCapacity ())
141
+
142
+ if err = web .Cache .Update (WebKeycloakDBPVC , pvc ); err != nil {
143
+ return err
144
+ }
145
+ }
146
+
147
+ return nil
148
+ }
149
+
41
150
func configureKeycloak (web * localWebProvider ) error {
42
151
nn := providers .GetNamespacedName (web .Env , "keycloak" )
43
152
@@ -140,15 +249,63 @@ func makeKeycloak(o obj.ClowdObject, objMap providers.ObjectMap, _ bool, nodePor
140
249
141
250
envVars := []core.EnvVar {
142
251
{
143
- Name : "DB_VENDOR" ,
144
- Value : "h2" ,
252
+ Name : "KC_DB" ,
253
+ Value : "postgres" ,
254
+ },
255
+ {
256
+ Name : "KC_DB_USERNAME" ,
257
+ ValueFrom : & core.EnvVarSource {
258
+ SecretKeyRef : & core.SecretKeySelector {
259
+ LocalObjectReference : core.LocalObjectReference {
260
+ Name : "keycloak-db" ,
261
+ },
262
+ Key : "username" ,
263
+ },
264
+ },
265
+ },
266
+ {
267
+ Name : "KC_DB_PASSWORD" ,
268
+ ValueFrom : & core.EnvVarSource {
269
+ SecretKeyRef : & core.SecretKeySelector {
270
+ LocalObjectReference : core.LocalObjectReference {
271
+ Name : "keycloak-db" ,
272
+ },
273
+ Key : "password" ,
274
+ },
275
+ },
276
+ },
277
+ {
278
+ Name : "KC_DB_URL_DATABASE" ,
279
+ ValueFrom : & core.EnvVarSource {
280
+ SecretKeyRef : & core.SecretKeySelector {
281
+ LocalObjectReference : core.LocalObjectReference {
282
+ Name : "keycloak-db" ,
283
+ },
284
+ Key : "name" ,
285
+ },
286
+ },
287
+ },
288
+ {
289
+ Name : "KC_DB_URL_HOST" ,
290
+ ValueFrom : & core.EnvVarSource {
291
+ SecretKeyRef : & core.SecretKeySelector {
292
+ LocalObjectReference : core.LocalObjectReference {
293
+ Name : "keycloak-db" ,
294
+ },
295
+ Key : "hostname" ,
296
+ },
297
+ },
298
+ },
299
+ {
300
+ Name : "KC_DB_URL_PORT" ,
301
+ Value : "5432" ,
145
302
},
146
303
{
147
304
Name : "PROXY_ADDRESS_FORWARDING" ,
148
305
Value : "true" ,
149
306
},
150
307
{
151
- Name : "KEYCLOAK_USER " ,
308
+ Name : "KEYCLOAK_ADMIN " ,
152
309
ValueFrom : & core.EnvVarSource {
153
310
SecretKeyRef : & core.SecretKeySelector {
154
311
LocalObjectReference : core.LocalObjectReference {
@@ -159,7 +316,7 @@ func makeKeycloak(o obj.ClowdObject, objMap providers.ObjectMap, _ bool, nodePor
159
316
},
160
317
},
161
318
{
162
- Name : "KEYCLOAK_PASSWORD " ,
319
+ Name : "KEYCLOAK_ADMIN_PASSWORD " ,
163
320
ValueFrom : & core.EnvVarSource {
164
321
SecretKeyRef : & core.SecretKeySelector {
165
322
LocalObjectReference : core.LocalObjectReference {
@@ -194,15 +351,15 @@ func makeKeycloak(o obj.ClowdObject, objMap providers.ObjectMap, _ bool, nodePor
194
351
195
352
livenessProbe := core.Probe {
196
353
ProbeHandler : probeHandler ,
197
- InitialDelaySeconds : 10 ,
354
+ InitialDelaySeconds : 60 ,
198
355
TimeoutSeconds : 2 ,
199
356
PeriodSeconds : 10 ,
200
357
SuccessThreshold : 1 ,
201
358
FailureThreshold : 3 ,
202
359
}
203
360
readinessProbe := core.Probe {
204
361
ProbeHandler : probeHandler ,
205
- InitialDelaySeconds : 20 ,
362
+ InitialDelaySeconds : 60 ,
206
363
TimeoutSeconds : 2 ,
207
364
PeriodSeconds : 10 ,
208
365
SuccessThreshold : 1 ,
@@ -213,9 +370,19 @@ func makeKeycloak(o obj.ClowdObject, objMap providers.ObjectMap, _ bool, nodePor
213
370
image := provutils .GetKeycloakImage (env )
214
371
215
372
c := core.Container {
216
- Name : nn .Name ,
217
- Image : image ,
218
- Env : envVars ,
373
+ Name : nn .Name ,
374
+ Image : image ,
375
+ Env : envVars ,
376
+ Args : []string {
377
+ "start" ,
378
+ "--import-realm" ,
379
+ "--hostname-strict" ,
380
+ "false" ,
381
+ "--http-enabled" ,
382
+ "true" ,
383
+ "--http-relative-path" ,
384
+ "/auth" ,
385
+ },
219
386
Ports : ports ,
220
387
LivenessProbe : & livenessProbe ,
221
388
ReadinessProbe : & readinessProbe ,
@@ -235,7 +402,7 @@ func makeKeycloak(o obj.ClowdObject, objMap providers.ObjectMap, _ bool, nodePor
235
402
VolumeMounts : []core.VolumeMount {
236
403
{
237
404
Name : "realm-import" ,
238
- MountPath : "/json " ,
405
+ MountPath : "/opt/keycloak/data/import/ " ,
239
406
},
240
407
},
241
408
}
0 commit comments