kubelatte-ce
Форк от sbertech/kubelatte-ce
98 строк · 3.0 Кб
1package creation
2
3import (
4"context"
5"fmt"
6v1alpha12 "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"
11metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12lbs "k8s.io/apimachinery/pkg/labels"
13"strings"
14)
15
16type RendererI interface {
17GetRenders(ctx context.Context, tiObject *v1alpha12.TriggerInstance) (renders []util.RenderItem)
18}
19
20type RenderController struct{}
21
22func NewRender() RendererI {
23return &RenderController{}
24}
25
26func (r *RenderController) GetRenders(ctx context.Context, tiObject *v1alpha12.TriggerInstance) (renders []util.RenderItem) {
27log := logger.FromContext(ctx)
28triggers := storage.Storage.GetTriggers()
29templs := storage.Storage.GetTemplates()
30for _, trigger := range triggers {
31for _, config := range trigger.Spec.CreationConfigs {
32if r.checkMatchSelector(ctx, &config, tiObject.Annotations, tiObject.Labels) {
33for _, ref := range config.TemplateRefs {
34t, ok := templs[ref]
35if ok {
36engine := templates.LoadTemplate(context.Background(), t)
37for _, engineTemplate := range engine.Templates() {
38var tempBuffer strings.Builder
39err := engineTemplate.Execute(&tempBuffer, tiObject)
40if err != nil {
41log.Errorf("RenderController: getRenders failed %s", err.Error())
42continue
43}
44renders = append(renders, util.RenderItem{
45Template: t,
46Render: tempBuffer.String(),
47Action: config.Action,
48CreationIsUniqueName: config.DisableUniqueName != "true",
49})
50log.Debugf("Got render: %s", tempBuffer.String())
51}
52}
53}
54}
55}
56}
57return renders
58}
59
60func (r *RenderController) checkMatchSelector(ctx context.Context, config *v1alpha12.CreationConfig, annotations map[string]string, labels map[string]string) bool {
61log := logger.FromContext(ctx)
62if labels != nil && len(config.LabelSelector.MatchExpressions) != 0 {
63labelSet := lbs.Set(labels)
64labelSelectors := metav1.LabelSelector{}
65
66for _, expression := range config.LabelSelector.MatchExpressions {
67
68labelSelectors.MatchExpressions = append(labelSelectors.MatchExpressions,
69metav1.LabelSelectorRequirement{
70Key: expression.Key,
71Operator: expression.Operator,
72Values: expression.Values,
73},
74)
75
76sel, err := metav1.LabelSelectorAsSelector(&labelSelectors)
77if err != nil {
78log.Errorf("RenderController: checkMatchSelector failed %s", err.Error())
79} else {
80return sel.Matches(labelSet)
81}
82}
83}
84
85if annotations != nil {
86triggerKey := fmt.Sprintf("%s/%s", config.AnnotationNamespace, config.AnnotationTrigger)
87triggerValue, ok := annotations[triggerKey]
88if ok {
89if triggerValue != "true" && triggerValue != "enabled" {
90log.Error("RenderController: checkMatchSelector failed skip creation cause annotation value is not valid")
91} else {
92return true
93}
94}
95}
96
97return false
98}
99