Skip to content

Commit b9a38b5

Browse files
committed
feat: implement mvp controller
Signed-off-by: Bence Csati <[email protected]>
1 parent 4b0d848 commit b9a38b5

File tree

10 files changed

+523
-10
lines changed

10 files changed

+523
-10
lines changed

charts/logging-operator/charts/logging-operator-crds/templates/logging.banzaicloud.io_axosyslogs.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ spec:
3636
type: object
3737
spec:
3838
properties:
39+
configReloadImage:
40+
properties:
41+
repository:
42+
type: string
43+
tag:
44+
type: string
45+
type: object
3946
destinations:
4047
items:
4148
properties:
@@ -45,6 +52,13 @@ spec:
4552
type: string
4653
type: object
4754
type: array
55+
image:
56+
properties:
57+
repository:
58+
type: string
59+
tag:
60+
type: string
61+
type: object
4862
logPaths:
4963
items:
5064
properties:

charts/logging-operator/crds/logging.banzaicloud.io_axosyslogs.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ spec:
3333
type: object
3434
spec:
3535
properties:
36+
configReloadImage:
37+
properties:
38+
repository:
39+
type: string
40+
tag:
41+
type: string
42+
type: object
3643
destinations:
3744
items:
3845
properties:
@@ -42,6 +49,13 @@ spec:
4249
type: string
4350
type: object
4451
type: array
52+
image:
53+
properties:
54+
repository:
55+
type: string
56+
tag:
57+
type: string
58+
type: object
4559
logPaths:
4660
items:
4761
properties:

config/crd/bases/logging.banzaicloud.io_axosyslogs.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ spec:
3333
type: object
3434
spec:
3535
properties:
36+
configReloadImage:
37+
properties:
38+
repository:
39+
type: string
40+
tag:
41+
type: string
42+
type: object
3643
destinations:
3744
items:
3845
properties:
@@ -42,6 +49,13 @@ spec:
4249
type: string
4350
type: object
4451
type: array
52+
image:
53+
properties:
54+
repository:
55+
type: string
56+
tag:
57+
type: string
58+
type: object
4559
logPaths:
4660
items:
4761
properties:

controllers/logging/axosyslog_controller.go

Lines changed: 84 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,30 @@ package controllers
1717
import (
1818
"context"
1919

20+
"emperror.dev/errors"
21+
"github.com/cisco-open/operator-tools/pkg/reconciler"
2022
"github.com/go-logr/logr"
23+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2124
ctrl "sigs.k8s.io/controller-runtime"
2225
"sigs.k8s.io/controller-runtime/pkg/client"
2326

24-
"github.com/kube-logging/logging-operator/pkg/sdk/logging/api/v1beta1"
27+
"github.com/kube-logging/logging-operator/pkg/resources"
28+
axosyslogresources "github.com/kube-logging/logging-operator/pkg/resources/axosyslog"
29+
v1beta1 "github.com/kube-logging/logging-operator/pkg/sdk/logging/api/v1beta1"
2530
)
2631

2732
// NewAxoSyslogReconciler creates a new AxoSyslogReconciler instance
28-
func NewAxoSyslogReconciler(client client.Client, log logr.Logger) *AxoSyslogReconciler {
33+
func NewAxoSyslogReconciler(client client.Client, log logr.Logger, opts reconciler.ReconcilerOpts) *AxoSyslogReconciler {
2934
return &AxoSyslogReconciler{
30-
Client: client,
31-
Log: log,
35+
Client: client,
36+
GenericResourceReconciler: reconciler.NewGenericReconciler(client, log, opts),
37+
Log: log,
3238
}
3339
}
3440

3541
type AxoSyslogReconciler struct {
3642
client.Client
43+
*reconciler.GenericResourceReconciler
3744
Log logr.Logger
3845
}
3946

@@ -50,13 +57,80 @@ func (r *AxoSyslogReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
5057

5158
log.V(1).Info("Reconciling AxoSyslog")
5259

53-
var axosyslog v1beta1.AxoSyslog
54-
if err := r.Get(ctx, req.NamespacedName, &axosyslog); err != nil {
60+
var axoSyslog v1beta1.AxoSyslog
61+
if err := r.Get(ctx, req.NamespacedName, &axoSyslog); err != nil {
5562
return ctrl.Result{}, client.IgnoreNotFound(err)
5663
}
5764

58-
if err := axosyslog.SetDefaults(); err != nil {
59-
return ctrl.Result{}, err
65+
if err := axoSyslog.SetDefaults(); err != nil {
66+
return ctrl.Result{}, errors.WrapIf(err, "failed to set defaults")
67+
}
68+
69+
for _, buildObject := range []resources.ResourceWithNamespace{
70+
axosyslogresources.ServiceAccount,
71+
axosyslogresources.Role,
72+
axosyslogresources.RoleBinding,
73+
} {
74+
o, state, err := buildObject(axoSyslog.Namespace)
75+
if err != nil {
76+
return ctrl.Result{}, errors.WrapIf(err, "failed to build object")
77+
}
78+
if o == nil {
79+
return ctrl.Result{}, errors.Errorf("Reconcile error! Resource %#v returns with nil object", buildObject)
80+
}
81+
82+
metaObj, ok := o.(metav1.Object)
83+
if !ok {
84+
return ctrl.Result{}, errors.Errorf("Reconcile error! Resource %#v returns with non-object", buildObject)
85+
}
86+
if err := ctrl.SetControllerReference(&axoSyslog, metaObj, r.Scheme()); err != nil {
87+
return ctrl.Result{}, errors.WrapIf(err, "failed to set controller reference")
88+
}
89+
90+
// Reconcile resources managed by the controller
91+
result, err := r.ReconcileResource(o, state)
92+
if err != nil {
93+
return ctrl.Result{}, errors.WrapIf(err, "failed to reconcile resource")
94+
}
95+
if result != nil {
96+
return *result, nil
97+
}
98+
}
99+
// TODO: config-check
100+
// TODO: output-secret && secret-mark
101+
// TODO: config-secret?
102+
103+
for _, buildObject := range []resources.ResourceWithSpec{
104+
axosyslogresources.StatefulSet,
105+
axosyslogresources.Service,
106+
axosyslogresources.HeadlessService,
107+
// TODO: service-metrics & buffer-metrics
108+
// axosyslogresources.ServiceMetrics,
109+
// axosyslogresources.ServiceBufferMetrics,
110+
} {
111+
o, state, err := buildObject(&axoSyslog)
112+
if err != nil {
113+
return ctrl.Result{}, errors.WrapIf(err, "failed to build object")
114+
}
115+
if o == nil {
116+
return ctrl.Result{}, errors.Errorf("Reconcile error! Resource %#v returns with nil object", buildObject)
117+
}
118+
119+
metaObj, ok := o.(metav1.Object)
120+
if !ok {
121+
return ctrl.Result{}, errors.Errorf("Reconcile error! Resource %#v returns with non-object", buildObject)
122+
}
123+
if err := ctrl.SetControllerReference(&axoSyslog, metaObj, r.Scheme()); err != nil {
124+
return ctrl.Result{}, errors.WrapIf(err, "failed to set controller reference")
125+
}
126+
127+
result, err := r.ReconcileResource(o, state)
128+
if err != nil {
129+
return ctrl.Result{}, errors.WrapIf(err, "failed to reconcile resource")
130+
}
131+
if result != nil {
132+
return *result, nil
133+
}
60134
}
61135

62136
return ctrl.Result{}, nil
@@ -65,6 +139,6 @@ func (r *AxoSyslogReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
65139
func SetupAxoSyslogWithManager(mgr ctrl.Manager, logger logr.Logger) error {
66140
return ctrl.NewControllerManagedBy(mgr).
67141
For(&v1beta1.AxoSyslog{}).
68-
Named("AxoSyslogController").
69-
Complete(NewAxoSyslogReconciler(mgr.GetClient(), logger))
142+
Named("axosyslog").
143+
Complete(NewAxoSyslogReconciler(mgr.GetClient(), logger, reconciler.ReconcilerOpts{}))
70144
}

docs/configuration/crds/v1beta1/axosyslog_types.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,21 @@ AxoSyslog is the Schema for the AxoSyslogs API
1919

2020
AxoSyslogSpec defines the desired state of AxoSyslog
2121

22+
### configReloadImage (*BasicImageSpec, optional) {#axosyslogspec-configreloadimage}
23+
24+
ConfigReloadImage is the image specification for the config reload
25+
26+
2227
### destinations ([]Destination, optional) {#axosyslogspec-destinations}
2328

2429
Destinations is a list of destinations to be rendered in the AxoSyslog configuration
2530

2631

32+
### image (*BasicImageSpec, optional) {#axosyslogspec-image}
33+
34+
Image is the image specification for AxoSyslog
35+
36+
2737
### logPaths ([]LogPath, optional) {#axosyslogspec-logpaths}
2838

2939
LogPaths is a list of log paths to be rendered in the AxoSyslog configuration

pkg/resources/axosyslog/rbac.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// Copyright © 2022 Cisco Systems, Inc. and/or its affiliates
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package axosyslog
16+
17+
import (
18+
"github.com/cisco-open/operator-tools/pkg/reconciler"
19+
corev1 "k8s.io/api/core/v1"
20+
rbacv1 "k8s.io/api/rbac/v1"
21+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22+
"k8s.io/apimachinery/pkg/runtime"
23+
)
24+
25+
const (
26+
LabelAppName = "app.kubernetes.io/name"
27+
LabelAppComponent = "app.kubernetes.io/component"
28+
commonAxoSyslogObjectValue = "axosyslog"
29+
)
30+
31+
func Role(namespace string) (runtime.Object, reconciler.DesiredState, error) {
32+
return &rbacv1.Role{
33+
ObjectMeta: metav1.ObjectMeta{
34+
Name: commonAxoSyslogObjectValue,
35+
Namespace: namespace,
36+
Labels: map[string]string{
37+
LabelAppName: commonAxoSyslogObjectValue,
38+
LabelAppComponent: commonAxoSyslogObjectValue,
39+
},
40+
},
41+
Rules: []rbacv1.PolicyRule{
42+
{
43+
APIGroups: []string{""},
44+
Resources: []string{"configmaps", "secrets"},
45+
Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"},
46+
},
47+
},
48+
}, reconciler.StatePresent, nil
49+
}
50+
51+
func RoleBinding(namespace string) (runtime.Object, reconciler.DesiredState, error) {
52+
return &rbacv1.RoleBinding{
53+
ObjectMeta: metav1.ObjectMeta{
54+
Name: commonAxoSyslogObjectValue,
55+
Labels: map[string]string{
56+
LabelAppName: commonAxoSyslogObjectValue,
57+
LabelAppComponent: commonAxoSyslogObjectValue,
58+
},
59+
},
60+
RoleRef: rbacv1.RoleRef{
61+
Kind: "Role",
62+
APIGroup: rbacv1.GroupName,
63+
Name: commonAxoSyslogObjectValue,
64+
},
65+
Subjects: []rbacv1.Subject{
66+
{
67+
Kind: rbacv1.ServiceAccountKind,
68+
Name: commonAxoSyslogObjectValue,
69+
Namespace: namespace,
70+
},
71+
},
72+
}, reconciler.StatePresent, nil
73+
}
74+
75+
// TODO: Implement STS overrides
76+
func ServiceAccount(namespace string) (runtime.Object, reconciler.DesiredState, error) {
77+
// TODO: Implement STS overrides
78+
// err := merge.Merge(account, r.axoSyslogSpec.ServiceAccountOverrides)
79+
80+
return &corev1.ServiceAccount{
81+
ObjectMeta: metav1.ObjectMeta{
82+
Name: commonAxoSyslogObjectValue,
83+
Namespace: namespace,
84+
Labels: map[string]string{
85+
LabelAppName: commonAxoSyslogObjectValue,
86+
LabelAppComponent: commonAxoSyslogObjectValue,
87+
},
88+
},
89+
}, reconciler.StatePresent, nil
90+
}

0 commit comments

Comments
 (0)