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

Commit ef83f01

Browse files
author
Pablo Mercado
authored
Merge pull request #2 from triggermesh/task/add-resources-common
Add resources common
2 parents 7be914a + 914c46a commit ef83f01

File tree

15 files changed

+746
-20
lines changed

15 files changed

+746
-20
lines changed

config/200-clusterroles.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ rules:
3434
- delete
3535
- patch
3636

37+
# Manage broker services
38+
- apiGroups:
39+
- ''
40+
resources:
41+
- services
42+
verbs:
43+
- get
44+
- list
45+
- watch
46+
- create
47+
- update
48+
- delete
49+
- patch
50+
51+
52+
3753
# Read reconciled TriggerMesh core resources and update their statuses
3854
# +rbac-check
3955
- apiGroups:

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/triggermesh/triggermesh-core
33
go 1.19
44

55
require (
6+
github.com/stretchr/testify v1.7.0
67
go.uber.org/zap v1.21.0
78
k8s.io/api v0.24.4
89
k8s.io/apimachinery v0.24.4
@@ -54,6 +55,7 @@ require (
5455
github.com/modern-go/reflect2 v1.0.2 // indirect
5556
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
5657
github.com/pkg/errors v0.9.1 // indirect
58+
github.com/pmezard/go-difflib v1.0.0 // indirect
5759
github.com/prometheus/client_golang v1.12.1 // indirect
5860
github.com/prometheus/client_model v0.2.0 // indirect
5961
github.com/prometheus/common v0.32.1 // indirect

pkg/apis/eventing/v1alpha1/broker_lifecycle.go renamed to pkg/apis/eventing/v1alpha1/redisbroker_lifecycle.go

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,22 @@ import (
1313
)
1414

1515
const (
16-
BrokerConditionReady = apis.ConditionReady
17-
BrokerConditionIngress apis.ConditionType = "IngressReady"
18-
BrokerConditionAddressable apis.ConditionType = "Addressable"
16+
RedisBrokerConditionReady = apis.ConditionReady
17+
RedisBrokerRedisDeployment apis.ConditionType = "RedisDeploymentReady"
18+
RedisBrokerRedisService apis.ConditionType = "RedisServiceReady"
19+
RedisBrokerBrokerDeployment apis.ConditionType = "BrokerDeploymentReady"
20+
RedisBrokerBrokerService apis.ConditionType = "BrokerServiceReady"
21+
RedisBrokerConditionAddressable apis.ConditionType = "Addressable"
1922
)
2023

21-
var brokerCondSet = apis.NewLivingConditionSet(
22-
BrokerConditionIngress,
23-
BrokerConditionAddressable,
24+
var redisBrokerCondSet = apis.NewLivingConditionSet(
25+
RedisBrokerRedisDeployment,
26+
RedisBrokerRedisService,
27+
RedisBrokerBrokerDeployment,
28+
RedisBrokerBrokerService,
29+
RedisBrokerConditionAddressable,
2430
)
25-
var brokerCondSetLock = sync.RWMutex{}
31+
var redisBrokerCondSetLock = sync.RWMutex{}
2632

2733
// GetGroupVersionKind returns GroupVersionKind for Brokers
2834
func (t *RedisBroker) GetGroupVersionKind() schema.GroupVersionKind {
@@ -36,26 +42,26 @@ func (t *RedisBroker) GetStatus() *duckv1.Status {
3642

3743
// RegisterAlternateBrokerConditionSet register a apis.ConditionSet for the given broker class.
3844
func RegisterAlternateBrokerConditionSet(conditionSet apis.ConditionSet) {
39-
brokerCondSetLock.Lock()
40-
defer brokerCondSetLock.Unlock()
45+
redisBrokerCondSetLock.Lock()
46+
defer redisBrokerCondSetLock.Unlock()
4147

42-
brokerCondSet = conditionSet
48+
redisBrokerCondSet = conditionSet
4349
}
4450

4551
// GetConditionSet retrieves the condition set for this resource. Implements the KRShaped interface.
4652
func (b *RedisBroker) GetConditionSet() apis.ConditionSet {
47-
brokerCondSetLock.RLock()
48-
defer brokerCondSetLock.RUnlock()
53+
redisBrokerCondSetLock.RLock()
54+
defer redisBrokerCondSetLock.RUnlock()
4955

50-
return brokerCondSet
56+
return redisBrokerCondSet
5157
}
5258

5359
// GetConditionSet retrieves the condition set for this resource.
5460
func (bs *RedisBrokerStatus) GetConditionSet() apis.ConditionSet {
55-
brokerCondSetLock.RLock()
56-
defer brokerCondSetLock.RUnlock()
61+
redisBrokerCondSetLock.RLock()
62+
defer redisBrokerCondSetLock.RUnlock()
5763

58-
return brokerCondSet
64+
return redisBrokerCondSet
5965
}
6066

6167
// GetTopLevelCondition returns the top level Condition.
@@ -68,9 +74,9 @@ func (bs *RedisBrokerStatus) GetTopLevelCondition() *apis.Condition {
6874
func (bs *RedisBrokerStatus) SetAddress(url *apis.URL) {
6975
bs.Address.URL = url
7076
if url != nil {
71-
bs.GetConditionSet().Manage(bs).MarkTrue(BrokerConditionAddressable)
77+
bs.GetConditionSet().Manage(bs).MarkTrue(RedisBrokerConditionAddressable)
7278
} else {
73-
bs.GetConditionSet().Manage(bs).MarkFalse(BrokerConditionAddressable, "nil URL", "URL is nil")
79+
bs.GetConditionSet().Manage(bs).MarkFalse(RedisBrokerConditionAddressable, "nil URL", "URL is nil")
7480
}
7581
}
7682

@@ -90,3 +96,7 @@ func (b *RedisBroker) IsReady() bool {
9096
func (bs *RedisBrokerStatus) InitializeConditions() {
9197
bs.GetConditionSet().Manage(bs).InitializeConditions()
9298
}
99+
100+
func (bs *RedisBrokerStatus) MarkRedisBrokerFailed(reason, messageFormat string, messageA ...interface{}) {
101+
redisBrokerCondSet.Manage(bs).MarkFalse(RedisBrokerRedisDeployment, reason, messageFormat, messageA...)
102+
}

pkg/reconciler/events.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2022 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package reconciler
5+
6+
// Reasons for API Events
7+
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+
17+
ReasonDeploymentCreate = "CreateDeployment"
18+
ReasonDeploymentGet = "GetDeployment"
19+
ReasonDeploymentUpdate = "UpdateDeployment"
20+
ReasonFailedDeploymentCreate = "FailedDeploymentCreate"
21+
ReasonFailedDeploymentUpdate = "FailedDeploymentUpdate"
22+
23+
// // ReasonServiceCreate indicates that an Service object was successfully created.
24+
// ReasonServiceCreate = "CreateService"
25+
// // ReasonServiceUpdate indicates that an Service object was successfully updated.
26+
// ReasonServiceUpdate = "UpdateService"
27+
// // ReasonFailedServiceCreate indicates that the creation of an Service object failed.
28+
// ReasonFailedServiceCreate = "FailedServiceCreate"
29+
// // ReasonFailedServiceUpdate indicates that the update of an Service object failed.
30+
// ReasonFailedServiceUpdate = "FailedServiceUpdate"
31+
32+
// // ReasonBadSinkURI indicates that the URI of a sink can't be determined.
33+
// ReasonBadSinkURI = "BadSinkURI"
34+
35+
// // ReasonInvalidSpec indicates that spec of a reconciled object is invalid.
36+
// ReasonInvalidSpec = "InvalidSpec"
37+
)

pkg/reconciler/redisbroker/controller.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@ package redisbroker
66
import (
77
"context"
88

9+
"k8s.io/client-go/tools/cache"
10+
kubeclient "knative.dev/pkg/client/injection/kube/client"
11+
"knative.dev/pkg/client/injection/kube/informers/apps/v1/deployment"
12+
"knative.dev/pkg/client/injection/kube/informers/core/v1/service"
13+
"knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount"
14+
"knative.dev/pkg/client/injection/kube/informers/rbac/v1/rolebinding"
915
"knative.dev/pkg/configmap"
1016
"knative.dev/pkg/controller"
1117

18+
eventingv1alpha1 "github.com/triggermesh/triggermesh-core/pkg/apis/eventing/v1alpha1"
1219
rbinformer "github.com/triggermesh/triggermesh-core/pkg/client/generated/injection/informers/eventing/v1alpha1/redisbroker"
1320
rbreconciler "github.com/triggermesh/triggermesh-core/pkg/client/generated/injection/reconciler/eventing/v1alpha1/redisbroker"
1421
)
@@ -19,13 +26,38 @@ func NewController(
1926
ctx context.Context,
2027
cmw configmap.Watcher,
2128
) *controller.Impl {
22-
rbInformer := rbinformer.Get(ctx)
2329

24-
r := &Reconciler{}
30+
rbInformer := rbinformer.Get(ctx)
31+
deploymentInformer := deployment.Get(ctx)
32+
serviceInformer := service.Get(ctx)
33+
serviceAccountInformer := serviceaccount.Get(ctx)
34+
roleBindingInformer := rolebinding.Get(ctx)
35+
36+
r := &Reconciler{
37+
kubeClientSet: kubeclient.Get(ctx),
38+
redisReconciler: newRedisReconciler(ctx, deploymentInformer.Lister()),
39+
serviceLister: serviceInformer.Lister(),
40+
serviceAccountLister: serviceAccountInformer.Lister(),
41+
roleBindingLister: roleBindingInformer.Lister(),
42+
}
2543

2644
impl := rbreconciler.NewImpl(ctx, r)
2745

2846
rbInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
2947

48+
deploymentInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
49+
FilterFunc: controller.FilterController(&eventingv1alpha1.RedisBroker{}),
50+
Handler: controller.HandleAll(impl.EnqueueControllerOf),
51+
})
52+
53+
serviceInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
54+
FilterFunc: controller.FilterController(&eventingv1alpha1.RedisBroker{}),
55+
Handler: controller.HandleAll(impl.EnqueueControllerOf),
56+
})
57+
serviceAccountInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
58+
FilterFunc: controller.FilterController(&eventingv1alpha1.RedisBroker{}),
59+
Handler: controller.HandleAll(impl.EnqueueControllerOf),
60+
})
61+
3062
return impl
3163
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package redisbroker
2+
3+
import (
4+
"context"
5+
6+
"go.uber.org/zap"
7+
appsv1 "k8s.io/api/apps/v1"
8+
corev1 "k8s.io/api/core/v1"
9+
apierrs "k8s.io/apimachinery/pkg/api/errors"
10+
"k8s.io/apimachinery/pkg/types"
11+
"k8s.io/client-go/kubernetes"
12+
appsv1listers "k8s.io/client-go/listers/apps/v1"
13+
k8sclient "knative.dev/pkg/client/injection/kube/client"
14+
"knative.dev/pkg/logging"
15+
pkgreconciler "knative.dev/pkg/reconciler"
16+
17+
eventingv1alpha1 "github.com/triggermesh/triggermesh-core/pkg/apis/eventing/v1alpha1"
18+
"github.com/triggermesh/triggermesh-core/pkg/reconciler"
19+
"github.com/triggermesh/triggermesh-core/pkg/reconciler/resources"
20+
)
21+
22+
type redisReconciler struct {
23+
client kubernetes.Interface
24+
deploymentLister appsv1listers.DeploymentLister
25+
}
26+
27+
func newRedisReconciler(ctx context.Context, deploymentLister appsv1listers.DeploymentLister) redisReconciler {
28+
return redisReconciler{
29+
client: k8sclient.Get(ctx),
30+
deploymentLister: deploymentLister,
31+
}
32+
}
33+
34+
func (r *redisReconciler) Reconcile(ctx context.Context, rb *eventingv1alpha1.RedisBroker) (*appsv1.Deployment, error) {
35+
36+
desired := buildRedisDeployment(rb)
37+
current, err := r.deploymentLister.Deployments(desired.Namespace).Get(desired.Name)
38+
switch {
39+
case err == nil:
40+
// TODO compare
41+
// TODO if equal return
42+
// continue
43+
case apierrs.IsNotFound(err):
44+
// continue
45+
default:
46+
fullname := types.NamespacedName{Namespace: desired.Namespace, Name: desired.Name}
47+
logging.FromContext(ctx).Error("Unable to get the deployment", zap.String("deployment", fullname.String()), zap.Error(err))
48+
rb.Status.MarkRedisBrokerFailed("DeploymentGetFailed", "Failed to get Redis deployment")
49+
50+
return nil, pkgreconciler.NewEvent(corev1.EventTypeWarning, reconciler.ReasonDeploymentGet,
51+
"Failed to get Redis deployment %s: %w", fullname, err)
52+
}
53+
54+
// Create
55+
56+
// TODO Update statuses
57+
58+
return current, nil
59+
}
60+
61+
func buildRedisDeployment(rb *eventingv1alpha1.RedisBroker) *appsv1.Deployment {
62+
return resources.NewDeployment(rb.Namespace, rb.Name+"-redis-server",
63+
resources.DeploymentWithMetaOptions(
64+
resources.MetaAddLabel("app", "redis-server"),
65+
resources.MetaAddLabel("eventing.triggermesh.io/redis-name", rb.Name+"-redis-server"),
66+
resources.MetaAddOwner(rb, rb.GetGroupVersionKind())),
67+
resources.DeploymentAddSelectorForTemplate("eventing.triggermesh.io/redis-name", rb.Name+"-redis-server"),
68+
resources.DeploymentSetReplicas(1),
69+
resources.DeploymentWithTemplateOption(
70+
resources.PodSpecAddContainer(
71+
resources.NewContainer("redis", "redis/redis-stack-server:latest",
72+
resources.ContainerAddEnvFromValue("REDIS_ARGS", "--appendonly yes"),
73+
resources.ContainerAddPort("redis", 6379)))))
74+
}

pkg/reconciler/redisbroker/reconciler.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,43 @@ package redisbroker
66
import (
77
"context"
88

9+
"go.uber.org/zap"
10+
"k8s.io/client-go/kubernetes"
11+
corev1listers "k8s.io/client-go/listers/core/v1"
12+
rbacv1listers "k8s.io/client-go/listers/rbac/v1"
13+
14+
"knative.dev/pkg/logging"
915
"knative.dev/pkg/reconciler"
1016

1117
eventingv1alpha1 "github.com/triggermesh/triggermesh-core/pkg/apis/eventing/v1alpha1"
1218
)
1319

1420
type Reconciler struct {
21+
kubeClientSet kubernetes.Interface
22+
redisReconciler redisReconciler
23+
serviceLister corev1listers.ServiceLister
24+
serviceAccountLister corev1listers.ServiceAccountLister
25+
roleBindingLister rbacv1listers.RoleBindingLister
1526
}
1627

1728
func (r *Reconciler) ReconcileKind(ctx context.Context, rb *eventingv1alpha1.RedisBroker) reconciler.Event {
29+
logging.FromContext(ctx).Infow("Reconciling", zap.Any("Broker", *rb))
30+
31+
// Clean any dangling resources
32+
33+
// Iterate triggers and create secret
34+
35+
// Make sure the Redis deployment exists and propagate the status to the Channel
36+
_, err := r.redisReconciler.Reconcile(ctx, rb)
37+
if err != nil {
38+
return err
39+
}
40+
41+
// create service for redis
42+
43+
// create deployment for broker
44+
45+
// create service for broker
46+
1847
return nil
1948
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2022 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package resources
4+
5+
import (
6+
corev1 "k8s.io/api/core/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
const (
11+
tName = "test-name"
12+
tNamespace = "test-namespace"
13+
tImage = "triggermesh/test:v1"
14+
)
15+
16+
var (
17+
tTrue = true
18+
19+
tPod = corev1.Pod{
20+
TypeMeta: metav1.TypeMeta{
21+
Kind: "Pod",
22+
APIVersion: corev1.SchemeGroupVersion.String(),
23+
},
24+
ObjectMeta: metav1.ObjectMeta{
25+
Name: tName,
26+
Namespace: tNamespace,
27+
},
28+
}
29+
)

0 commit comments

Comments
 (0)