Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 3771fd9

Browse files
author
odacremolbap
committed
move secrets reconciler to generic
1 parent d2e28f0 commit 3771fd9

File tree

15 files changed

+250
-119
lines changed

15 files changed

+250
-119
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package v1alpha1
2+
3+
import (
4+
"knative.dev/pkg/kmeta"
5+
)
6+
7+
type ReconcilableBroker interface {
8+
kmeta.OwnerRefable
9+
10+
GetReconcilableBrokerStatus() ReconcilableBrokerStatus
11+
GetOwnedObjectsPrefix() string
12+
}
13+
14+
type ReconcilableBrokerStatus interface {
15+
MarkConfigSecretFailed(reason, messageFormat string, messageA ...interface{})
16+
MarkConfigSecretReady()
17+
}

pkg/apis/eventing/v1alpha1/memory_lifecycle.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ func (t *MemoryBroker) GetStatus() *duckv1.Status {
4949
return &t.Status.Status
5050
}
5151

52+
// GetReconcilableBrokerStatus returns a status interface that allows generic reconciler
53+
// to manage it.
54+
func (t *MemoryBroker) GetReconcilableBrokerStatus() ReconcilableBrokerStatus {
55+
return &t.Status
56+
}
57+
58+
// GetOwnedObjectsPrefix returns a prefix string to be used for created/owned objects.
59+
func (t *MemoryBroker) GetOwnedObjectsPrefix() string {
60+
return "rb"
61+
}
62+
5263
// GetConditionSet retrieves the condition set for this resource. Implements the KRShaped interface.
5364
func (b *MemoryBroker) GetConditionSet() apis.ConditionSet {
5465
memoryBrokerCondSetLock.RLock()

pkg/apis/eventing/v1alpha1/memory_types.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
88
"k8s.io/apimachinery/pkg/runtime"
99
duckv1 "knative.dev/pkg/apis/duck/v1"
10-
"knative.dev/pkg/kmeta"
1110
)
1211

1312
// +genclient
@@ -36,8 +35,8 @@ type MemoryBroker struct {
3635
var (
3736
// Make sure this is a kubernetes object.
3837
_ runtime.Object = (*MemoryBroker)(nil)
39-
// Check that we can create OwnerReferences with this object.
40-
_ kmeta.OwnerRefable = (*MemoryBroker)(nil)
38+
// Check that we can reconcile this object as a Broker.
39+
_ ReconcilableBroker = (*MemoryBroker)(nil)
4140
// Check that the type conforms to the duck Knative Resource shape.
4241
_ duckv1.KRShaped = (*MemoryBroker)(nil)
4342
)

pkg/apis/eventing/v1alpha1/redisbroker_lifecycle.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ func (t *RedisBroker) GetStatus() *duckv1.Status {
5757
return &t.Status.Status
5858
}
5959

60+
// GetReconcilableBrokerStatus returns a status interface that allows generic reconciler
61+
// to manage it.
62+
func (t *RedisBroker) GetReconcilableBrokerStatus() ReconcilableBrokerStatus {
63+
return &t.Status
64+
}
65+
66+
// GetOwnedObjectsPrefix returns a prefix string to be used for created/owned objects.
67+
func (t *RedisBroker) GetOwnedObjectsPrefix() string {
68+
return "rb"
69+
}
70+
6071
// GetConditionSet retrieves the condition set for this resource. Implements the KRShaped interface.
6172
func (b *RedisBroker) GetConditionSet() apis.ConditionSet {
6273
redisBrokerCondSetLock.RLock()

pkg/apis/eventing/v1alpha1/redisbroker_types.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
99
"k8s.io/apimachinery/pkg/runtime"
1010
duckv1 "knative.dev/pkg/apis/duck/v1"
11-
"knative.dev/pkg/kmeta"
1211
)
1312

1413
// +genclient
@@ -37,8 +36,8 @@ type RedisBroker struct {
3736
var (
3837
// Make sure this is a kubernetes object.
3938
_ runtime.Object = (*RedisBroker)(nil)
40-
// Check that we can create OwnerReferences with this object.
41-
_ kmeta.OwnerRefable = (*RedisBroker)(nil)
39+
// Check that we can reconcile this object as a Broker.
40+
_ ReconcilableBroker = (*RedisBroker)(nil)
4241
// Check that the type conforms to the duck Knative Resource shape.
4342
_ duckv1.KRShaped = (*RedisBroker)(nil)
4443
)

pkg/reconciler/common/common.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package common
2+
3+
import (
4+
"strings"
5+
6+
"knative.dev/pkg/kmeta"
7+
)
8+
9+
func AppAnnotationValue(or kmeta.OwnerRefable) string {
10+
return strings.ToLower(or.GetGroupVersionKind().Kind)
11+
}

pkg/reconciler/events.go renamed to pkg/reconciler/common/events.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
// Copyright 2022 TriggerMesh Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
package reconciler
4+
package common
55

66
// Reasons for API Events
77
const (
8-
// // ReasonRBACCreate indicates that an RBAC object was successfully created.
9-
// ReasonRBACCreate = "CreateRBAC"
10-
// // ReasonRBACUpdate indicates that an RBAC object was successfully updated.
11-
// ReasonRBACUpdate = "UpdateRBAC"
12-
// // ReasonFailedRBACCreate indicates that the creation of an RBAC object failed.
13-
// ReasonFailedRBACCreate = "FailedRBACCreate"
14-
// // ReasonFailedRBACUpdate indicates that the update of an RBAC object failed.
15-
// ReasonFailedRBACUpdate = "FailedRBACUpdate"
16-
178
ReasonDeploymentCreate = "CreateDeployment"
189
ReasonDeploymentUpdate = "UpdateDeployment"
1910
ReasonFailedDeploymentGet = "FailedDeploymentGet"
2011
ReasonFailedDeploymentCreate = "FailedDeploymentCreate"
2112
ReasonFailedDeploymentUpdate = "FailedDeploymentUpdate"
2213

14+
ReasonFailedSecretGet = "FailedSecretGet"
15+
ReasonFailedSecretCreate = "FailedSecretCreate"
16+
ReasonFailedSecretUpdate = "FailedSecretUpdate"
17+
2318
ReasonFailedServiceAccountGet = "FailedServiceAccountGet"
2419
ReasonFailedServiceAccountCreate = "FailedServiceAccountCreate"
2520
ReasonFailedRoleBindingGet = "FailedRoleBindingGet"

pkg/reconciler/redisbroker/reconcile_secret.go renamed to pkg/reconciler/common/reconcile_secret.go

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package redisbroker
1+
package common
22

33
import (
44
"context"
@@ -20,33 +20,39 @@ import (
2020

2121
"github.com/triggermesh/brokers/pkg/config/broker"
2222

23-
eventingv1alpha1 "github.com/triggermesh/triggermesh-core/pkg/apis/eventing/v1alpha1"
23+
"github.com/triggermesh/triggermesh-core/pkg/apis/eventing/v1alpha1"
2424
eventingv1alpha1listers "github.com/triggermesh/triggermesh-core/pkg/client/generated/listers/eventing/v1alpha1"
25-
"github.com/triggermesh/triggermesh-core/pkg/reconciler"
2625
"github.com/triggermesh/triggermesh-core/pkg/reconciler/resources"
2726
"github.com/triggermesh/triggermesh-core/pkg/reconciler/semantic"
2827
)
2928

3029
const (
31-
secretResourceSuffix = "rb-config"
32-
configSecretKey = "config"
30+
ConfigSecretKey = "config"
3331
)
3432

33+
var (
34+
secretResourceSuffix = "config"
35+
)
36+
37+
type SecretReconciler interface {
38+
Reconcile(ctx context.Context, rb v1alpha1.ReconcilableBroker) (*corev1.Secret, error)
39+
}
40+
3541
type secretReconciler struct {
3642
client kubernetes.Interface
3743
secretLister corev1listers.SecretLister
3844
triggerLister eventingv1alpha1listers.TriggerLister
3945
}
4046

41-
func newSecretReconciler(ctx context.Context, secretLister corev1listers.SecretLister, triggerLister eventingv1alpha1listers.TriggerLister) secretReconciler {
42-
return secretReconciler{
47+
func NewSecretReconciler(ctx context.Context, secretLister corev1listers.SecretLister, triggerLister eventingv1alpha1listers.TriggerLister) SecretReconciler {
48+
return &secretReconciler{
4349
client: k8sclient.Get(ctx),
4450
secretLister: secretLister,
4551
triggerLister: triggerLister,
4652
}
4753
}
4854

49-
func (r *secretReconciler) reconcile(ctx context.Context, rb *eventingv1alpha1.RedisBroker) (*corev1.Secret, error) {
55+
func (r *secretReconciler) Reconcile(ctx context.Context, rb v1alpha1.ReconcilableBroker) (*corev1.Secret, error) {
5056
desired, err := r.buildConfigSecret(ctx, rb)
5157
if err != nil {
5258
return nil, err
@@ -62,48 +68,51 @@ func (r *secretReconciler) reconcile(ctx context.Context, rb *eventingv1alpha1.R
6268
current, err = r.client.CoreV1().Secrets(desired.Namespace).Update(ctx, desired, metav1.UpdateOptions{})
6369
if err != nil {
6470
fullname := types.NamespacedName{Namespace: desired.Namespace, Name: desired.Name}
65-
logging.FromContext(ctx).Error("Unable to update the secret", zap.String("secret", fullname.String()), zap.Error(err))
66-
rb.Status.MarkRedisDeploymentFailed(reconciler.ReasonFailedDeploymentUpdate, "Failed to update Redis deployment")
71+
logging.FromContext(ctx).Error("Unable to update secret", zap.String("secret", fullname.String()), zap.Error(err))
72+
rb.GetReconcilableBrokerStatus().MarkConfigSecretFailed(ReasonFailedSecretUpdate, "Failed to update config from secret")
6773

68-
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, reconciler.ReasonFailedDeploymentUpdate,
69-
"Failed to get Redis deployment %s: %w", fullname, err)
74+
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, ReasonFailedSecretUpdate,
75+
"Failed to update config from secret %s: %w", fullname, err)
7076
}
7177
}
7278

7379
case !apierrs.IsNotFound(err):
74-
// An error occurred retrieving current deployment.
80+
// An error occurred retrieving current secret.
7581
fullname := types.NamespacedName{Namespace: desired.Namespace, Name: desired.Name}
76-
logging.FromContext(ctx).Error("Unable to get the deployment", zap.String("deployment", fullname.String()), zap.Error(err))
77-
rb.Status.MarkRedisDeploymentFailed(reconciler.ReasonFailedDeploymentGet, "Failed to get Redis deployment")
82+
logging.FromContext(ctx).Error("Unable to get secret", zap.String("secret", fullname.String()), zap.Error(err))
83+
rb.GetReconcilableBrokerStatus().MarkConfigSecretFailed(ReasonFailedSecretGet, "Failed to get config from secret")
7884

79-
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, reconciler.ReasonFailedDeploymentGet,
80-
"Failed to get Redis deployment %s: %w", fullname, err)
85+
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, ReasonFailedSecretGet,
86+
"Failed to get config from secret %s: %w", fullname, err)
8187

8288
default:
83-
// The deployment has not been found, create it.
89+
// The secret has not been found, create it.
8490
current, err = r.client.CoreV1().Secrets(desired.Namespace).Create(ctx, desired, metav1.CreateOptions{})
8591
if err != nil {
8692
fullname := types.NamespacedName{Namespace: desired.Namespace, Name: desired.Name}
87-
logging.FromContext(ctx).Error("Unable to create the deployment", zap.String("deployment", fullname.String()), zap.Error(err))
88-
rb.Status.MarkRedisDeploymentFailed(reconciler.ReasonFailedDeploymentCreate, "Failed to create Redis deployment")
93+
logging.FromContext(ctx).Error("Unable to create secret", zap.String("secret", fullname.String()), zap.Error(err))
94+
rb.GetReconcilableBrokerStatus().MarkConfigSecretFailed(ReasonFailedSecretCreate, "Failed to create secret for config")
8995

90-
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, reconciler.ReasonFailedDeploymentCreate,
91-
"Failed to create Redis deployment %s: %w", fullname, err)
96+
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, ReasonFailedSecretCreate,
97+
"Failed to create secret for config %s: %w", fullname, err)
9298
}
9399
}
94100

95-
rb.Status.MarkConfigSecretReady()
101+
rb.GetReconcilableBrokerStatus().MarkConfigSecretReady()
96102

97103
return current, nil
98104
}
99105

100-
func (r *secretReconciler) buildConfigSecret(ctx context.Context, rb *eventingv1alpha1.RedisBroker) (*corev1.Secret, error) {
101-
triggers, err := r.triggerLister.Triggers(rb.Namespace).List(labels.Everything())
106+
func (r *secretReconciler) buildConfigSecret(ctx context.Context, rb v1alpha1.ReconcilableBroker) (*corev1.Secret, error) {
107+
meta := rb.GetObjectMeta()
108+
ns, name := meta.GetNamespace(), meta.GetName()
109+
110+
triggers, err := r.triggerLister.Triggers(ns).List(labels.Everything())
102111
if err != nil {
103112
logging.FromContext(ctx).Error("Unable to list triggers at namespace", zap.Error(err))
104-
rb.Status.MarkConfigSecretFailed(reconciler.ReasonFailedTriggerList, "Failed to list triggers")
113+
rb.GetReconcilableBrokerStatus().MarkConfigSecretFailed(ReasonFailedTriggerList, "Failed to list triggers")
105114

106-
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, reconciler.ReasonFailedTriggerList,
115+
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, ReasonFailedTriggerList,
107116
"Failed to list triggers: %w", err)
108117
}
109118

@@ -166,19 +175,21 @@ func (r *secretReconciler) buildConfigSecret(ctx context.Context, rb *eventingv1
166175
b, err := yaml.Marshal(cfg)
167176
if err != nil {
168177
logging.FromContext(ctx).Error("Unable to marshal configuration into YAML", zap.Error(err))
169-
rb.Status.MarkConfigSecretFailed(reconciler.ReasonFailedConfigSerialize, "Failed to serialize configuration")
178+
rb.GetReconcilableBrokerStatus().MarkConfigSecretFailed(ReasonFailedConfigSerialize, "Failed to serialize configuration")
170179

171-
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, reconciler.ReasonFailedConfigSerialize,
180+
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, ReasonFailedConfigSerialize,
172181
"Failed to serialize configuration: %w", err)
173182
}
174183

175-
return resources.NewSecret(rb.Namespace, rb.Name+"-"+secretResourceSuffix,
184+
sn := name + "-" + rb.GetOwnedObjectsPrefix() + "-" + secretResourceSuffix
185+
186+
return resources.NewSecret(ns, sn,
176187
resources.SecretWithMetaOptions(
177-
resources.MetaAddLabel(resources.AppNameLabel, appAnnotationValue),
188+
resources.MetaAddLabel(resources.AppNameLabel, AppAnnotationValue(rb)),
178189
resources.MetaAddLabel(resources.AppComponentLabel, "broker-config"),
179190
resources.MetaAddLabel(resources.AppPartOfLabel, resources.PartOf),
180191
resources.MetaAddLabel(resources.AppManagedByLabel, resources.ManagedBy),
181-
resources.MetaAddLabel(resources.AppInstanceLabel, rb.Name+"-"+secretResourceSuffix),
182-
resources.MetaAddOwner(rb, rb.GetGroupVersionKind())),
183-
resources.SecretSetData(configSecretKey, b)), nil
192+
resources.MetaAddLabel(resources.AppInstanceLabel, sn),
193+
resources.MetaAddOwner(meta, rb.GetGroupVersionKind())),
194+
resources.SecretSetData(ConfigSecretKey, b)), nil
184195
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Copyright 2022 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package memorybroker
5+
6+
import (
7+
"context"
8+
"strconv"
9+
10+
"go.uber.org/zap"
11+
v1 "k8s.io/api/core/v1"
12+
"k8s.io/client-go/kubernetes"
13+
14+
"knative.dev/pkg/apis"
15+
"knative.dev/pkg/logging"
16+
"knative.dev/pkg/network"
17+
"knative.dev/pkg/reconciler"
18+
19+
eventingv1alpha1 "github.com/triggermesh/triggermesh-core/pkg/apis/eventing/v1alpha1"
20+
"github.com/triggermesh/triggermesh-core/pkg/reconciler/common"
21+
)
22+
23+
const (
24+
appAnnotationValue = "memorybroker"
25+
)
26+
27+
type Reconciler struct {
28+
kubeClientSet kubernetes.Interface
29+
secretReconciler common.SecretReconciler
30+
// secretReconciler secretReconciler
31+
// memoryReconciler memoryReconciler
32+
// brokerReconciler brokerReconciler
33+
// saReconciler serviceAccountReconciler
34+
}
35+
36+
func (r *Reconciler) ReconcileKind(ctx context.Context, rb *eventingv1alpha1.MemoryBroker) reconciler.Event {
37+
logging.FromContext(ctx).Infow("Reconciling", zap.Any("Broker", *rb))
38+
39+
// Make sure the Memory deployment and service exists.
40+
_, memorySvc, err := r.memoryReconciler.reconcile(ctx, rb)
41+
if err != nil {
42+
return err
43+
}
44+
45+
// Iterate triggers and create secret.
46+
secret, err := r.secretReconciler.Reconcile(ctx, rb)
47+
if err != nil {
48+
return err
49+
}
50+
51+
// Make sure the Broker service account and roles exists.
52+
sa, _, err := r.saReconciler.reconcile(ctx, rb)
53+
if err != nil {
54+
return err
55+
}
56+
57+
// Make sure the Broker deployment for Memory exists and that it points to the Memory service.
58+
_, brokerSvc, err := r.brokerReconciler.reconcile(ctx, rb, sa, memorySvc, secret)
59+
if err != nil {
60+
return err
61+
}
62+
63+
// Set address to the Broker service.
64+
rb.Status.SetAddress(getSericeAddress(brokerSvc))
65+
66+
return nil
67+
}
68+
69+
func getSericeAddress(svc *v1.Service) *apis.URL {
70+
var port string
71+
if svc.Spec.Ports[0].Port != 80 {
72+
port = ":" + strconv.Itoa(int(svc.Spec.Ports[0].Port))
73+
}
74+
75+
return apis.HTTP(
76+
network.GetServiceHostname(svc.Name, svc.Namespace) + port)
77+
}

pkg/reconciler/redisbroker/controller.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
rbinformer "github.com/triggermesh/triggermesh-core/pkg/client/generated/injection/informers/eventing/v1alpha1/redisbroker"
3131
trginformer "github.com/triggermesh/triggermesh-core/pkg/client/generated/injection/informers/eventing/v1alpha1/trigger"
3232
rbreconciler "github.com/triggermesh/triggermesh-core/pkg/client/generated/injection/reconciler/eventing/v1alpha1/redisbroker"
33+
"github.com/triggermesh/triggermesh-core/pkg/reconciler/common"
3334
"github.com/triggermesh/triggermesh-core/pkg/reconciler/resources"
3435
)
3536

@@ -67,7 +68,8 @@ func NewController(
6768

6869
r := &Reconciler{
6970
kubeClientSet: kubeclient.Get(ctx),
70-
secretReconciler: newSecretReconciler(ctx, secretInformer.Lister(), trgInformer.Lister()),
71+
secretReconciler: common.NewSecretReconciler(ctx, secretInformer.Lister(), trgInformer.Lister()),
72+
// newSecretReconciler(ctx, secretInformer.Lister(), trgInformer.Lister()),
7173
redisReconciler: redisReconciler{
7274
client: kubeclient.Get(ctx),
7375
deploymentLister: deploymentInformer.Lister(),
@@ -114,7 +116,7 @@ func NewController(
114116
endpointsInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
115117
FilterFunc: func(obj interface{}) bool {
116118
ep, ok := obj.(*corev1.Endpoints)
117-
if !ok || ep.Labels != nil || ep.Labels[resources.AppNameLabel] == appAnnotationValue {
119+
if !ok || ep.Labels != nil || ep.Labels[resources.AppNameLabel] == common.AppAnnotationValue(rb) {
118120
return false
119121
}
120122

0 commit comments

Comments
 (0)