Skip to content

Commit 055a55b

Browse files
committed
Add Results configuration in tekton config
This will add the Results configuration to the tekton config and will be installed by default through tekton config Signed-off-by: Shiv Verma <[email protected]>
1 parent fc83072 commit 055a55b

File tree

15 files changed

+487
-11
lines changed

15 files changed

+487
-11
lines changed

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module github.com/tektoncd/operator
22

3-
go 1.22.5
3+
go 1.22.7
4+
45
toolchain go1.22.8
56

67
require (

go.sum

+1-1
Original file line numberDiff line numberDiff line change
@@ -1231,7 +1231,7 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY
12311231
github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
12321232
github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
12331233
github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
1234-
github.com/googleapis/enterprise-certificate-proxy v0.3.3 h1:QRje2j5GZimBzlbhGA2V2QlGNgL8G6e+wGo/+/2bWI0=
1234+
github.com/googleapis/enterprise-certificate-proxy v0.3.3 h1:G6q7VHBoU74wQHXFsZSLMPl0rFw0ZDrlZ3rt6/aTBII=
12351235
github.com/googleapis/enterprise-certificate-proxy v0.3.3/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
12361236
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
12371237
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=

pkg/apis/operator/v1alpha1/tektonconfig_defaults.go

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func (tc *TektonConfig) SetDefaults(ctx context.Context) {
3232
tc.Spec.Pipeline.setDefaults()
3333
tc.Spec.Trigger.setDefaults()
3434
tc.Spec.Chain.setDefaults()
35+
tc.Spec.Result.setDefaults()
3536

3637
if IsOpenShiftPlatform() {
3738
if tc.Spec.Platforms.OpenShift.PipelinesAsCode == nil {

pkg/apis/operator/v1alpha1/tektonconfig_types.go

+3
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ type TektonConfigSpec struct {
105105
// Chain holds the customizable option for chains component
106106
// +optional
107107
Chain Chain `json:"chain,omitempty"`
108+
// Result holds the customize option for results component
109+
// +optional
110+
Result Result `json:"result,omitempty"`
108111
// Dashboard holds the customizable options for dashboards component
109112
// +optional
110113
Dashboard Dashboard `json:"dashboard,omitempty"`

pkg/apis/operator/v1alpha1/tektonconfig_validation.go

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func (tc *TektonConfig) Validate(ctx context.Context) (errs *apis.FieldError) {
120120
errs = errs.Also(tc.Spec.Dashboard.Options.validate("spec.dashboard.options"))
121121
errs = errs.Also(tc.Spec.Chain.Options.validate("spec.chain.options"))
122122
errs = errs.Also(tc.Spec.Trigger.Options.validate("spec.trigger.options"))
123+
errs = errs.Also(tc.Spec.Result.Options.validate("spec.result.options"))
123124

124125
return errs.Also(tc.Spec.Trigger.TriggersProperties.validate("spec.trigger"))
125126
}

pkg/apis/operator/v1alpha1/tektonresult_defaults.go

+5
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,8 @@ func (tp *TektonResult) SetDefaults(ctx context.Context) {
2626
tp.Spec.TLSHostnameOverride = ""
2727
}
2828
}
29+
30+
// Sets default values of Result
31+
func (c *Result) setDefaults() {
32+
// TODO: Set the other default values for Result
33+
}

pkg/apis/operator/v1alpha1/tektonresult_types.go

+9
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ type LokiStackProperties struct {
6161
LokiStackNamespace string `json:"loki_stack_namespace,omitempty"`
6262
}
6363

64+
// Result defines the field to customize Result component
65+
type Result struct {
66+
// enable or disable Result Component
67+
Disabled bool `json:"disabled"`
68+
TektonResultSpec `json:",inline"`
69+
// Options holds additions fields and these fields will be updated on the manifests
70+
Options AdditionalOptions `json:"options"`
71+
}
72+
6473
// ResultsAPIProperties defines the fields which are configurable for
6574
// Results API server config
6675
type ResultsAPIProperties struct {

pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/reconciler/kubernetes/tektoninstallerset/client/list.go

+15
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,18 @@ func (i *InstallerSetClient) ListCustomSet(ctx context.Context, labelSelector st
3737
}
3838
return is, nil
3939
}
40+
41+
// ListPreSet return the lists of Pre sets with the provided labelSelector
42+
func (i *InstallerSetClient) ListPreSet(ctx context.Context, labelSelector string) (*v1alpha1.TektonInstallerSetList, error) {
43+
logger := logging.FromContext(ctx)
44+
logger.Debugf("%v: checking installer sets with labels: %v", i.resourceKind, labelSelector)
45+
46+
is, err := i.clientSet.List(ctx, v1.ListOptions{LabelSelector: labelSelector})
47+
if err != nil {
48+
return nil, err
49+
}
50+
if len(is.Items) == 0 {
51+
logger.Debugf("%v: no installer sets found with labels: %v", i.resourceKind, labelSelector)
52+
}
53+
return is, nil
54+
}

pkg/reconciler/kubernetes/tektonresult/tektonresult.go

+79-8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package tektonresult
1818

1919
import (
2020
"context"
21+
"crypto/rand"
22+
"encoding/base64"
2123
"errors"
2224
"fmt"
2325

@@ -145,12 +147,24 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tr *v1alpha1.TektonResul
145147
return errors.New(errMsg)
146148
}
147149

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+
}
153166
}
167+
154168
tr.Status.MarkDependenciesInstalled()
155169

156170
if err := r.extension.PreReconcile(ctx, tr); err != nil {
@@ -314,17 +328,74 @@ func (r *Reconciler) updateTektonResultsStatus(ctx context.Context, tr *v1alpha1
314328
}
315329

316330
// 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 {
318332
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{})
320334
if err != nil {
321335
if apierrors.IsNotFound(err) {
322336
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))
324338
return err
325339
}
326340
logger.Error(err)
327341
return err
328342
}
329343
return nil
330344
}
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+
}

pkg/reconciler/openshift/tektonresult/extension.go

+32
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ import (
2828
"github.com/tektoncd/operator/pkg/reconciler/common"
2929
"github.com/tektoncd/operator/pkg/reconciler/kubernetes/tektoninstallerset/client"
3030
occommon "github.com/tektoncd/operator/pkg/reconciler/openshift/common"
31+
"github.com/tektoncd/operator/pkg/reconciler/shared/hash"
3132
appsv1 "k8s.io/api/apps/v1"
3233
corev1 "k8s.io/api/core/v1"
34+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3335
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3436
k8sruntime "k8s.io/apimachinery/pkg/runtime"
3537
"knative.dev/pkg/logging"
@@ -110,6 +112,36 @@ func (oe openshiftExtension) PreReconcile(ctx context.Context, tc v1alpha1.Tekto
110112
mf = *oe.internalDBManifest
111113
}
112114

115+
preSetLabel := metav1.LabelSelector{
116+
MatchLabels: map[string]string{
117+
v1alpha1.CreatedByKey: "TektonResult",
118+
v1alpha1.InstallerSetType: "pre",
119+
},
120+
}
121+
preSetLabelSelector, err := common.LabelSelector(preSetLabel)
122+
if err != nil {
123+
return err
124+
}
125+
preSetList, err := oe.installerSetClient.ListPreSet(ctx, preSetLabelSelector)
126+
if err != nil {
127+
return err
128+
}
129+
for _, is := range preSetList.Items {
130+
// compute TektonResult Spec
131+
expectedSpecHash, err := hash.Compute(result.Spec)
132+
if err != nil {
133+
return err
134+
}
135+
// delete the preset installersets if spec hash been changed
136+
if expectedSpecHash != is.Annotations[v1alpha1.LastAppliedHashKey] {
137+
if err := oe.installerSetClient.CleanupPreSet(ctx); err != nil {
138+
return err
139+
}
140+
141+
}
142+
143+
}
144+
113145
if (result.Spec.LokiStackName != "" && result.Spec.LokiStackNamespace != "") ||
114146
strings.EqualFold(result.Spec.LogsType, "LOKI") {
115147
mf = mf.Append(*oe.logsRBACManifest)

pkg/reconciler/shared/tektonconfig/controller.go

+8
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
tektonConfiginformer "github.com/tektoncd/operator/pkg/client/injection/informers/operator/v1alpha1/tektonconfig"
3131
tektonInstallerinformer "github.com/tektoncd/operator/pkg/client/injection/informers/operator/v1alpha1/tektoninstallerset"
3232
tektonPipelineinformer "github.com/tektoncd/operator/pkg/client/injection/informers/operator/v1alpha1/tektonpipeline"
33+
tektonResultinformer "github.com/tektoncd/operator/pkg/client/injection/informers/operator/v1alpha1/tektonresult"
3334
tektonTriggerinformer "github.com/tektoncd/operator/pkg/client/injection/informers/operator/v1alpha1/tektontrigger"
3435
tektonConfigreconciler "github.com/tektoncd/operator/pkg/client/injection/reconciler/operator/v1alpha1/tektonconfig"
3536
"github.com/tektoncd/operator/pkg/reconciler/common"
@@ -105,6 +106,13 @@ func NewExtensibleController(generator common.ExtensionGenerator) injection.Cont
105106
logger.Panicf("Couldn't register TektonChain informer event handler: %w", err)
106107
}
107108

109+
if _, err := tektonResultinformer.Get(ctx).Informer().AddEventHandler(cache.FilteringResourceEventHandler{
110+
FilterFunc: controller.FilterController(&v1alpha1.TektonConfig{}),
111+
Handler: controller.HandleAll(impl.EnqueueControllerOf),
112+
}); err != nil {
113+
logger.Panicf("Couldn't register TektonResult informer event handler: %w", err)
114+
}
115+
108116
if _, err := tektonInstallerinformer.Get(ctx).Informer().AddEventHandler(cache.FilteringResourceEventHandler{
109117
FilterFunc: controller.FilterController(&v1alpha1.TektonConfig{}),
110118
Handler: controller.HandleAll(impl.EnqueueControllerOf),

0 commit comments

Comments
 (0)