kubelatte-ce
Форк от sbertech/kubelatte-ce
135 строк · 3.2 Кб
1package initmanager2
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.Ticker15triggersExist bool16templatesExist bool17scopesExist bool18act InitManagerI
19}
20
21type InitManagerI interface {22Start(ctx context.Context)23Stop(ctx context.Context)24CheckResources(ctx context.Context) error25DoesTriggersExist() bool26DoesTemplatesExist() bool27DoesScopesExist() bool28}
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 = mgr44}45mgr.act = act46return mgr47}
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)57return58}59
60if m.triggersExist && m.templatesExist && m.scopesExist {61m.act.Stop(ctx)62return63}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 error76var err error77
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 errs91}
92
93func (m *InitManager) DoesTriggersExist() bool {94return m.triggersExist95}
96
97func (m *InitManager) DoesTemplatesExist() bool {98return m.templatesExist99}
100
101func (m *InitManager) DoesScopesExist() bool {102return m.scopesExist103}
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, ErrCheckTriggers111}112return len(triggers.Items) != 0, nil113}
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, ErrCheckTemplates121}122
123return len(templates.Items) != 0, nil124}
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, ErrCheckScopes132}133
134return len(scopes.Items) != 0, nil135}
136