kubelatte-ce

Форк
2
Форк от sbertech/kubelatte-ce
98 строк · 3.0 Кб
1
package creation
2

3
import (
4
	"context"
5
	"fmt"
6
	v1alpha12 "gitverse.ru/synapse/kubelatte/pkg/api/v1alpha1"
7
	"gitverse.ru/synapse/kubelatte/pkg/observability/logger"
8
	"gitverse.ru/synapse/kubelatte/pkg/storage"
9
	"gitverse.ru/synapse/kubelatte/pkg/util"
10
	"gitverse.ru/synapse/kubelatte/pkg/util/templates"
11
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12
	lbs "k8s.io/apimachinery/pkg/labels"
13
	"strings"
14
)
15

16
type RendererI interface {
17
	GetRenders(ctx context.Context, tiObject *v1alpha12.TriggerInstance) (renders []util.RenderItem)
18
}
19

20
type RenderController struct{}
21

22
func NewRender() RendererI {
23
	return &RenderController{}
24
}
25

26
func (r *RenderController) GetRenders(ctx context.Context, tiObject *v1alpha12.TriggerInstance) (renders []util.RenderItem) {
27
	log := logger.FromContext(ctx)
28
	triggers := storage.Storage.GetTriggers()
29
	templs := storage.Storage.GetTemplates()
30
	for _, trigger := range triggers {
31
		for _, config := range trigger.Spec.CreationConfigs {
32
			if r.checkMatchSelector(ctx, &config, tiObject.Annotations, tiObject.Labels) {
33
				for _, ref := range config.TemplateRefs {
34
					t, ok := templs[ref]
35
					if ok {
36
						engine := templates.LoadTemplate(context.Background(), t)
37
						for _, engineTemplate := range engine.Templates() {
38
							var tempBuffer strings.Builder
39
							err := engineTemplate.Execute(&tempBuffer, tiObject)
40
							if err != nil {
41
								log.Errorf("RenderController: getRenders failed %s", err.Error())
42
								continue
43
							}
44
							renders = append(renders, util.RenderItem{
45
								Template:             t,
46
								Render:               tempBuffer.String(),
47
								Action:               config.Action,
48
								CreationIsUniqueName: config.DisableUniqueName != "true",
49
							})
50
							log.Debugf("Got render: %s", tempBuffer.String())
51
						}
52
					}
53
				}
54
			}
55
		}
56
	}
57
	return renders
58
}
59

60
func (r *RenderController) checkMatchSelector(ctx context.Context, config *v1alpha12.CreationConfig, annotations map[string]string, labels map[string]string) bool {
61
	log := logger.FromContext(ctx)
62
	if labels != nil && len(config.LabelSelector.MatchExpressions) != 0 {
63
		labelSet := lbs.Set(labels)
64
		labelSelectors := metav1.LabelSelector{}
65

66
		for _, expression := range config.LabelSelector.MatchExpressions {
67

68
			labelSelectors.MatchExpressions = append(labelSelectors.MatchExpressions,
69
				metav1.LabelSelectorRequirement{
70
					Key:      expression.Key,
71
					Operator: expression.Operator,
72
					Values:   expression.Values,
73
				},
74
			)
75

76
			sel, err := metav1.LabelSelectorAsSelector(&labelSelectors)
77
			if err != nil {
78
				log.Errorf("RenderController: checkMatchSelector failed %s", err.Error())
79
			} else {
80
				return sel.Matches(labelSet)
81
			}
82
		}
83
	}
84

85
	if annotations != nil {
86
		triggerKey := fmt.Sprintf("%s/%s", config.AnnotationNamespace, config.AnnotationTrigger)
87
		triggerValue, ok := annotations[triggerKey]
88
		if ok {
89
			if triggerValue != "true" && triggerValue != "enabled" {
90
				log.Error("RenderController: checkMatchSelector failed skip creation cause annotation value is not valid")
91
			} else {
92
				return true
93
			}
94
		}
95
	}
96

97
	return false
98
}
99

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.