kubelatte-ce
Форк от sbertech/kubelatte-ce
98 строк · 3.0 Кб
1package creation2
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.Builder39err := engineTemplate.Execute(&tempBuffer, tiObject)40if err != nil {41log.Errorf("RenderController: getRenders failed %s", err.Error())42continue43}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 renders58}
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 true93}94}95}96
97return false98}
99