@@ -18,6 +18,8 @@ package tektonresult
18
18
19
19
import (
20
20
"context"
21
+ "crypto/rand"
22
+ "encoding/base64"
21
23
"errors"
22
24
"fmt"
23
25
@@ -145,12 +147,24 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tr *v1alpha1.TektonResul
145
147
return errors .New (errMsg )
146
148
}
147
149
148
- // check if the secrets are created
149
- // TODO: Create secret automatically if they don't exist
150
- // TODO: And remove this check in future release.
151
- if err := r .validateSecretsAreCreated (ctx , tr ); err != nil {
152
- return err
150
+ // If external database is not set then create default DB otherwise validate it
151
+ if ! tr .Spec .IsExternalDB {
152
+ if err := r .createDBSecret (ctx , tr ); err != nil {
153
+ return err
154
+ }
155
+ } else {
156
+ if err := r .validateSecretsAreCreated (ctx , tr , DbSecretName ); err != nil {
157
+ return err
158
+ }
159
+ }
160
+
161
+ // Validated TLS Secret for kubernetes platform
162
+ if ! v1alpha1 .IsOpenShiftPlatform () {
163
+ if err := r .validateSecretsAreCreated (ctx , tr , TlsSecretName ); err != nil {
164
+ return err
165
+ }
153
166
}
167
+
154
168
tr .Status .MarkDependenciesInstalled ()
155
169
156
170
if err := r .extension .PreReconcile (ctx , tr ); err != nil {
@@ -314,17 +328,74 @@ func (r *Reconciler) updateTektonResultsStatus(ctx context.Context, tr *v1alpha1
314
328
}
315
329
316
330
// TektonResults expects secrets to be created before installing
317
- func (r * Reconciler ) validateSecretsAreCreated (ctx context.Context , tr * v1alpha1.TektonResult ) error {
331
+ func (r * Reconciler ) validateSecretsAreCreated (ctx context.Context , tr * v1alpha1.TektonResult , secretName string ) error {
318
332
logger := logging .FromContext (ctx )
319
- _ , err := r .kubeClientSet .CoreV1 ().Secrets (tr .Spec .TargetNamespace ).Get (ctx , DbSecretName , metav1.GetOptions {})
333
+ _ , err := r .kubeClientSet .CoreV1 ().Secrets (tr .Spec .TargetNamespace ).Get (ctx , secretName , metav1.GetOptions {})
320
334
if err != nil {
321
335
if apierrors .IsNotFound (err ) {
322
336
logger .Error (err )
323
- tr .Status .MarkDependencyMissing (fmt .Sprintf ("%s secret is missing" , DbSecretName ))
337
+ tr .Status .MarkDependencyMissing (fmt .Sprintf ("%s secret is missing" , secretName ))
324
338
return err
325
339
}
326
340
logger .Error (err )
327
341
return err
328
342
}
329
343
return nil
330
344
}
345
+
346
+ // Generate the DB secret
347
+ func (r * Reconciler ) getDBSecret (name string , namespace string , tr * v1alpha1.TektonResult ) * corev1.Secret {
348
+ s := & corev1.Secret {
349
+ ObjectMeta : metav1.ObjectMeta {
350
+ Name : name ,
351
+ Namespace : namespace ,
352
+ OwnerReferences : []metav1.OwnerReference {getOwnerRef (tr )},
353
+ },
354
+ Type : corev1 .SecretTypeOpaque ,
355
+ StringData : map [string ]string {},
356
+ }
357
+ password , _ := generateRandomBaseString (20 )
358
+ s .StringData ["POSTGRES_PASSWORD" ] = password
359
+ s .StringData ["POSTGRES_USER" ] = "result"
360
+ return s
361
+ }
362
+
363
+ // Create Result default database
364
+ func (r * Reconciler ) createDBSecret (ctx context.Context , tr * v1alpha1.TektonResult ) error {
365
+ logger := logging .FromContext (ctx )
366
+
367
+ // Get the DB secret, if not found then create the DB secret
368
+ _ , err := r .kubeClientSet .CoreV1 ().Secrets (tr .Spec .TargetNamespace ).Get (ctx , DbSecretName , metav1.GetOptions {})
369
+ if err != nil {
370
+ if apierrors .IsNotFound (err ) {
371
+ // If not found then create DB secret with default data
372
+ newDBSecret := r .getDBSecret (DbSecretName , tr .Spec .TargetNamespace , tr )
373
+ _ , err := r .kubeClientSet .CoreV1 ().Secrets (tr .Spec .TargetNamespace ).Create (ctx , newDBSecret , metav1.CreateOptions {})
374
+ if err != nil {
375
+ logger .Error (err )
376
+ tr .Status .MarkDependencyMissing (fmt .Sprintf ("Default db %s creation is failing" , DbSecretName ))
377
+ return err
378
+ }
379
+ }
380
+ }
381
+ return nil
382
+ }
383
+
384
+ // Get an owner reference of Tekton Result
385
+ func getOwnerRef (tr * v1alpha1.TektonResult ) metav1.OwnerReference {
386
+ return * metav1 .NewControllerRef (tr , tr .GroupVersionKind ())
387
+ }
388
+
389
+ func generateRandomBaseString (size int ) (string , error ) {
390
+ bytes := make ([]byte , size )
391
+
392
+ // Generate random bytes
393
+ _ , err := rand .Read (bytes )
394
+ if err != nil {
395
+ return "" , err
396
+ }
397
+ // Encode the random bytes into a Base64 string
398
+ base64String := base64 .StdEncoding .EncodeToString (bytes )
399
+
400
+ return base64String , nil
401
+ }
0 commit comments