kubelatte-ce
Форк от sbertech/kubelatte-ce
135 строк · 3.2 Кб
1package initmanager
2
3import (
4"context"
5"errors"
6"gitverse.ru/synapse/kubelatte/pkg/observability/logger"
7"gitverse.ru/synapse/kubelatte/pkg/operator/utils"
8"gitverse.ru/synapse/kubelatte/pkg/util/env"
9metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10"time"
11)
12
13type InitManager struct {
14ticker *time.Ticker
15triggersExist bool
16templatesExist bool
17scopesExist bool
18act InitManagerI
19}
20
21type InitManagerI interface {
22Start(ctx context.Context)
23Stop(ctx context.Context)
24CheckResources(ctx context.Context) error
25DoesTriggersExist() bool
26DoesTemplatesExist() bool
27DoesScopesExist() bool
28}
29
30var (
31ErrCheckTriggers = errors.New("failed list triggers")
32ErrCheckTemplates = errors.New("failed list templates")
33ErrCheckScopes = errors.New("failed list scopes")
34)
35
36func NewInitManager(act InitManagerI) InitManagerI {
37mgr := &InitManager{
38triggersExist: !utils.IsControllerNeeded("trigger"),
39templatesExist: !utils.IsControllerNeeded("template"),
40scopesExist: !utils.IsControllerNeeded("scope"),
41}
42if act == nil {
43act = mgr
44}
45mgr.act = act
46return mgr
47}
48
49func (m *InitManager) Start(ctx context.Context) {
50m.ticker = time.NewTicker(3 * time.Second)
51for {
52select {
53case <-m.ticker.C:
54_ = m.act.CheckResources(ctx)
55case <-ctx.Done():
56m.act.Stop(ctx)
57return
58}
59
60if m.triggersExist && m.templatesExist && m.scopesExist {
61m.act.Stop(ctx)
62return
63}
64}
65}
66
67func (m *InitManager) Stop(ctx context.Context) {
68if m.ticker != nil {
69m.ticker.Stop()
70}
71ctx.Done()
72}
73
74func (m *InitManager) CheckResources(ctx context.Context) error {
75var errs error
76var err error
77
78if !m.triggersExist && utils.IsControllerNeeded("trigger") {
79m.triggersExist, err = checkTriggers(ctx)
80errs = errors.Join(errs, err)
81}
82if !m.templatesExist && utils.IsControllerNeeded("template") {
83m.templatesExist, err = checkTemplates(ctx)
84errs = errors.Join(errs, err)
85}
86if !m.scopesExist && utils.IsControllerNeeded("scope") {
87m.scopesExist, err = checkScopes(ctx)
88errs = errors.Join(errs, err)
89}
90return errs
91}
92
93func (m *InitManager) DoesTriggersExist() bool {
94return m.triggersExist
95}
96
97func (m *InitManager) DoesTemplatesExist() bool {
98return m.templatesExist
99}
100
101func (m *InitManager) DoesScopesExist() bool {
102return m.scopesExist
103}
104
105func checkTriggers(ctx context.Context) (bool, error) {
106log := logger.FromContext(ctx)
107triggers, err := utils.Cl.Trigger(env.OperatorNamespace).List(ctx, metav1.ListOptions{})
108if err != nil {
109log.Errorf("[InitManager] Failed List triggers %s", err)
110return false, ErrCheckTriggers
111}
112return len(triggers.Items) != 0, nil
113}
114
115func checkTemplates(ctx context.Context) (bool, error) {
116log := logger.FromContext(ctx)
117templates, err := utils.Cl.Template(env.OperatorNamespace).List(ctx, metav1.ListOptions{})
118if err != nil {
119log.Errorf("[InitManager] Failed List templates %s", err)
120return false, ErrCheckTemplates
121}
122
123return len(templates.Items) != 0, nil
124}
125
126func checkScopes(ctx context.Context) (bool, error) {
127log := logger.FromContext(ctx)
128scopes, err := utils.Cl.Scope(env.OperatorNamespace).List(ctx, metav1.ListOptions{})
129if err != nil {
130log.Errorf("[InitManager] Failed List scopes %s", err)
131return false, ErrCheckScopes
132}
133
134return len(scopes.Items) != 0, nil
135}
136