Skip to content

Commit 51f5209

Browse files
committed
Adding lokistack status to console configmap
1 parent e6337b9 commit 51f5209

File tree

6 files changed

+81
-22
lines changed

6 files changed

+81
-22
lines changed

internal/controller/consoleplugin/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type LokiConfig struct {
2424
URL string `yaml:"url" json:"url"`
2525
Labels []string `yaml:"labels" json:"labels"`
2626

27+
Status string `yaml:"status,omitempty" json:"status,omitempty"`
2728
StatusURL string `yaml:"statusUrl,omitempty" json:"statusUrl,omitempty"`
2829
Timeout api.Duration `yaml:"timeout,omitempty" json:"timeout,omitempty"`
2930
TenantID string `yaml:"tenantID,omitempty" json:"tenantID,omitempty"`

internal/controller/consoleplugin/consoleplugin_objects.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strconv"
1010
"time"
1111

12+
lokiv1 "github.com/grafana/loki/operator/apis/loki/v1"
1213
osv1 "github.com/openshift/api/console/v1"
1314
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
1415
"gopkg.in/yaml.v2"
@@ -493,9 +494,24 @@ func (b *builder) setFrontendConfig(fconf *cfg.FrontendConfig) error {
493494
return nil
494495
}
495496

497+
func getLokiStatus(lokiStack *lokiv1.LokiStack) string {
498+
if lokiStack != nil {
499+
for _, conditions := range lokiStack.Status.Conditions {
500+
if conditions.Reason == "ReadyComponents" {
501+
if conditions.Status == "True" {
502+
return "ready"
503+
}
504+
break
505+
}
506+
}
507+
return "pending"
508+
}
509+
return ""
510+
}
511+
496512
// returns a configmap with a digest of its configuration contents, which will be used to
497513
// detect any configuration change
498-
func (b *builder) configMap(ctx context.Context) (*corev1.ConfigMap, string, error) {
514+
func (b *builder) configMap(ctx context.Context, lokiStack *lokiv1.LokiStack) (*corev1.ConfigMap, string, error) {
499515
config := cfg.PluginConfig{
500516
Server: cfg.ServerConfig{
501517
Port: int(*b.advanced.Port),
@@ -511,6 +527,10 @@ func (b *builder) configMap(ctx context.Context) (*corev1.ConfigMap, string, err
511527
// configure loki
512528
var err error
513529
config.Loki, err = b.getLokiConfig()
530+
if lokiStack != nil {
531+
config.Loki.Status = getLokiStatus(lokiStack)
532+
config.Loki.StatusURL = ""
533+
}
514534
if err != nil {
515535
return nil, "", err
516536
}

internal/controller/consoleplugin/consoleplugin_reconciler.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ import (
1414
"k8s.io/apimachinery/pkg/types"
1515
"sigs.k8s.io/controller-runtime/pkg/log"
1616

17+
lokiv1 "github.com/grafana/loki/operator/apis/loki/v1"
1718
flowslatest "github.com/netobserv/network-observability-operator/api/flowcollector/v1beta2"
1819
"github.com/netobserv/network-observability-operator/internal/controller/constants"
1920
"github.com/netobserv/network-observability-operator/internal/controller/reconcilers"
2021
"github.com/netobserv/network-observability-operator/internal/pkg/helper"
2122
"github.com/netobserv/network-observability-operator/internal/pkg/resources"
23+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2224
)
2325

2426
// Type alias
@@ -83,7 +85,7 @@ func (r *CPReconciler) Reconcile(ctx context.Context, desired *flowslatest.FlowC
8385
}
8486
}
8587

86-
cmDigest, err := r.reconcileConfigMap(ctx, &builder)
88+
cmDigest, err := r.reconcileConfigMap(ctx, &builder, &desired.Spec)
8789
if err != nil {
8890
return err
8991
}
@@ -179,8 +181,30 @@ func (r *CPReconciler) reconcilePlugin(ctx context.Context, builder *builder, de
179181
return nil
180182
}
181183

182-
func (r *CPReconciler) reconcileConfigMap(ctx context.Context, builder *builder) (string, error) {
183-
newCM, configDigest, err := builder.configMap(ctx)
184+
func (r *CPReconciler) reconcileConfigMap(ctx context.Context, builder *builder, desired *flowslatest.FlowCollectorSpec) (string, error) {
185+
lokiStack := &lokiv1.LokiStack{}
186+
if desired.Loki.Mode == flowslatest.LokiModeLokiStack {
187+
if r.ClusterInfo.HasLokiStack() {
188+
ns := desired.Loki.LokiStack.Namespace
189+
if ns == "" {
190+
ns = desired.Namespace
191+
}
192+
if err := r.Client.Get(ctx, types.NamespacedName{Name: desired.Loki.LokiStack.Name, Namespace: ns}, lokiStack); err != nil {
193+
lokiStack = nil
194+
if apierrors.IsNotFound(err) {
195+
log.FromContext(ctx).Info("LokiStack resource not found, status will not be available",
196+
"name", desired.Loki.LokiStack.Name,
197+
"namespace", ns)
198+
} else {
199+
log.FromContext(ctx).Error(err, "Failed to get LokiStack resource",
200+
"name", desired.Loki.LokiStack.Name,
201+
"namespace", ns)
202+
}
203+
}
204+
}
205+
}
206+
207+
newCM, configDigest, err := builder.configMap(ctx, lokiStack)
184208
if err != nil {
185209
return "", err
186210
}

internal/controller/consoleplugin/consoleplugin_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func getAutoScalerSpecs() (ascv2.HorizontalPodAutoscaler, flowslatest.FlowCollec
110110
func getBuilder(spec *flowslatest.FlowCollectorSpec, lk *helper.LokiConfig) builder {
111111
info := reconcilers.Common{Namespace: testNamespace, Loki: lk, ClusterInfo: &cluster.Info{}}
112112
b := newBuilder(info.NewInstance(map[reconcilers.ImageRef]string{reconcilers.MainImage: testImage}, status.Instance{}), spec, constants.PluginName)
113-
_, _, _ = b.configMap(context.Background()) // build configmap to update builder's volumes
113+
_, _, _ = b.configMap(context.Background(), nil) // build configmap to update builder's volumes
114114
return b
115115
}
116116

@@ -223,8 +223,8 @@ func TestConfigMapUpdateCheck(t *testing.T) {
223223
}
224224
spec := flowslatest.FlowCollectorSpec{ConsolePlugin: plugin}
225225
builder := getBuilder(&spec, &loki)
226-
old, _, _ := builder.configMap(context.Background())
227-
nEw, _, _ := builder.configMap(context.Background())
226+
old, _, _ := builder.configMap(context.Background(), nil)
227+
nEw, _, _ := builder.configMap(context.Background(), nil)
228228
assert.Equal(old.Data, nEw.Data)
229229

230230
// update loki
@@ -239,15 +239,15 @@ func TestConfigMapUpdateCheck(t *testing.T) {
239239
}},
240240
}
241241
builder = getBuilder(&spec, &loki)
242-
nEw, _, _ = builder.configMap(context.Background())
242+
nEw, _, _ = builder.configMap(context.Background(), nil)
243243
assert.NotEqual(old.Data, nEw.Data)
244244
old = nEw
245245

246246
// set status url and enable default tls
247247
loki.LokiManualParams.StatusURL = "http://loki.status:3100/"
248248
loki.LokiManualParams.StatusTLS.Enable = true
249249
builder = getBuilder(&spec, &loki)
250-
nEw, _, _ = builder.configMap(context.Background())
250+
nEw, _, _ = builder.configMap(context.Background(), nil)
251251
assert.NotEqual(old.Data, nEw.Data)
252252
old = nEw
253253

@@ -258,7 +258,7 @@ func TestConfigMapUpdateCheck(t *testing.T) {
258258
CertFile: "status-ca.crt",
259259
}
260260
builder = getBuilder(&spec, &loki)
261-
nEw, _, _ = builder.configMap(context.Background())
261+
nEw, _, _ = builder.configMap(context.Background(), nil)
262262
assert.NotEqual(old.Data, nEw.Data)
263263
old = nEw
264264

@@ -270,7 +270,7 @@ func TestConfigMapUpdateCheck(t *testing.T) {
270270
CertKey: "tls.key",
271271
}
272272
builder = getBuilder(&spec, &loki)
273-
nEw, _, _ = builder.configMap(context.Background())
273+
nEw, _, _ = builder.configMap(context.Background(), nil)
274274
assert.NotEqual(old.Data, nEw.Data)
275275
}
276276

@@ -286,8 +286,8 @@ func TestConfigMapUpdateWithLokistackMode(t *testing.T) {
286286
loki := helper.NewLokiConfig(&lokiSpec, "any")
287287
spec := flowslatest.FlowCollectorSpec{ConsolePlugin: plugin, Loki: lokiSpec}
288288
builder := getBuilder(&spec, &loki)
289-
old, _, _ := builder.configMap(context.Background())
290-
nEw, _, _ := builder.configMap(context.Background())
289+
old, _, _ := builder.configMap(context.Background(), nil)
290+
nEw, _, _ := builder.configMap(context.Background(), nil)
291291
assert.Equal(old.Data, nEw.Data)
292292

293293
// update lokistack name
@@ -296,7 +296,7 @@ func TestConfigMapUpdateWithLokistackMode(t *testing.T) {
296296

297297
spec = flowslatest.FlowCollectorSpec{ConsolePlugin: plugin, Loki: lokiSpec}
298298
builder = getBuilder(&spec, &loki)
299-
nEw, _, _ = builder.configMap(context.Background())
299+
nEw, _, _ = builder.configMap(context.Background(), nil)
300300
assert.NotEqual(old.Data, nEw.Data)
301301
old = nEw
302302

@@ -306,7 +306,7 @@ func TestConfigMapUpdateWithLokistackMode(t *testing.T) {
306306

307307
spec = flowslatest.FlowCollectorSpec{ConsolePlugin: plugin, Loki: lokiSpec}
308308
builder = getBuilder(&spec, &loki)
309-
nEw, _, _ = builder.configMap(context.Background())
309+
nEw, _, _ = builder.configMap(context.Background(), nil)
310310
assert.NotEqual(old.Data, nEw.Data)
311311
}
312312

@@ -331,7 +331,7 @@ func TestConfigMapContent(t *testing.T) {
331331
Processor: flowslatest.FlowCollectorFLP{SubnetLabels: flowslatest.SubnetLabels{OpenShiftAutoDetect: ptr.To(false)}},
332332
}
333333
builder := getBuilder(&spec, &loki)
334-
cm, _, err := builder.configMap(context.Background())
334+
cm, _, err := builder.configMap(context.Background(), nil)
335335
assert.NotNil(cm)
336336
assert.Nil(err)
337337

internal/controller/flowcollector_controller.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
lokiv1 "github.com/grafana/loki/operator/apis/loki/v1"
78
osv1 "github.com/openshift/api/console/v1"
89
securityv1 "github.com/openshift/api/security/v1"
910
appsv1 "k8s.io/api/apps/v1"
@@ -12,6 +13,7 @@ import (
1213
ctrl "sigs.k8s.io/controller-runtime"
1314
"sigs.k8s.io/controller-runtime/pkg/client"
1415
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
16+
"sigs.k8s.io/controller-runtime/pkg/handler"
1517
"sigs.k8s.io/controller-runtime/pkg/log"
1618

1719
flowslatest "github.com/netobserv/network-observability-operator/api/flowcollector/v1beta2"
@@ -68,6 +70,11 @@ func Start(ctx context.Context, mgr *manager.Manager) (manager.PostCreateHook, e
6870
log.Info("CNO not detected: using ovnKubernetes config and reconciler")
6971
}
7072

73+
if mgr.ClusterInfo.HasLokiStack() {
74+
builder.Watches(&lokiv1.LokiStack{}, &handler.EnqueueRequestForObject{})
75+
log.Info("LokiStack CRD detected")
76+
}
77+
7178
ctrl, err := builder.Build(&r)
7279
if err != nil {
7380
return nil, err

internal/pkg/cluster/cluster.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"sync"
99

1010
"github.com/coreos/go-semver/semver"
11+
lokiv1 "github.com/grafana/loki/operator/apis/loki/v1"
1112
configv1 "github.com/openshift/api/config/v1"
1213
osv1 "github.com/openshift/api/console/v1"
1314
operatorv1 "github.com/openshift/api/operator/v1"
@@ -43,12 +44,13 @@ type Info struct {
4344
}
4445

4546
var (
46-
consolePlugin = "consoleplugins." + osv1.GroupVersion.String()
47-
cno = "networks." + operatorv1.GroupVersion.String()
48-
svcMonitor = "servicemonitors." + monv1.SchemeGroupVersion.String()
49-
promRule = "prometheusrules." + monv1.SchemeGroupVersion.String()
50-
ocpSecurity = "securitycontextconstraints." + securityv1.SchemeGroupVersion.String()
47+
consolePlugin = "consoleplugins." + osv1.GroupVersion.String()
48+
cno = "networks." + operatorv1.GroupVersion.String()
49+
svcMonitor = "servicemonitors." + monv1.SchemeGroupVersion.String()
50+
promRule = "prometheusrules." + monv1.SchemeGroupVersion.String()
51+
ocpSecurity = "securitycontextconstraints." + securityv1.SchemeGroupVersion.String()
5152
endpointSlices = "endpointslices." + discoveryv1.SchemeGroupVersion.String()
53+
lokistacks = "lokistacks." + lokiv1.GroupVersion.String()
5254
)
5355

5456
func NewInfo(ctx context.Context, cl client.Client, dcl *discovery.DiscoveryClient, onRefresh func()) (*Info, func(ctx context.Context) error, error) {
@@ -74,6 +76,7 @@ func (c *Info) fetchAvailableAPIs(ctx context.Context) error {
7476
promRule: false,
7577
ocpSecurity: false,
7678
endpointSlices: false,
79+
lokistacks: false,
7780
}
7881
for apiName := range apisMap {
7982
if hasAPI(apiName, resources) {
@@ -281,9 +284,13 @@ func (c *Info) HasPromRule() bool {
281284
return c.apisMap[promRule]
282285
}
283286

284-
// HasEndpointSlices returns true if "endpointslices.discovery.k8s.io" API was found
285287
func (c *Info) HasEndpointSlices() bool {
286288
c.apisMapLock.RLock()
287289
defer c.apisMapLock.RUnlock()
288290
return c.apisMap[endpointSlices]
289291
}
292+
293+
// HasLokiStack returns true if "lokistack" API was found
294+
func (c *Info) HasLokiStack() bool {
295+
return c.apisMap[lokistacks]
296+
}

0 commit comments

Comments
 (0)