Rename the CRD and all related types for better clarity: - CozystackResourceDefinition -> ApplicationDefinition - CozystackResourceDefinitionList -> ApplicationDefinitionList - CozystackResourceDefinitionSpec -> ApplicationDefinitionSpec - All related nested types updated accordingly Updated components: - API types and generated deepcopy code - Controllers and reconcilers - Dashboard, lineagecontrollerwebhook, crdmem packages - CRD YAML definition and Helm chart - All 25 cozyrds YAML manifests - Migration scripts and documentation Added migration 23 to remove old cozystack-resource-definition-crd HelmRelease. Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
73 lines
2.4 KiB
Go
73 lines
2.4 KiB
Go
package lineagecontrollerwebhook
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"text/template"
|
|
|
|
cozyv1alpha1 "github.com/cozystack/cozystack/api/v1alpha1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/labels"
|
|
"sigs.k8s.io/controller-runtime/pkg/log"
|
|
)
|
|
|
|
// matchName checks if the provided name matches any of the resource names in the array.
|
|
// Each entry in resourceNames is treated as a Go template that gets rendered using the passed context.
|
|
// A nil resourceNames array matches any string.
|
|
func matchName(ctx context.Context, name string, templateContext map[string]string, resourceNames []string) bool {
|
|
if resourceNames == nil {
|
|
return true
|
|
}
|
|
|
|
logger := log.FromContext(ctx)
|
|
for _, templateStr := range resourceNames {
|
|
tmpl, err := template.New("resourceName").Parse(templateStr)
|
|
if err != nil {
|
|
logger.Error(err, "failed to parse resource name template", "template", templateStr)
|
|
continue
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
err = tmpl.Execute(&buf, templateContext)
|
|
if err != nil {
|
|
logger.Error(err, "failed to execute resource name template", "template", templateStr, "context", templateContext)
|
|
continue
|
|
}
|
|
|
|
if buf.String() == name {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func matchResourceToSelector(ctx context.Context, name string, templateContext, l map[string]string, s *cozyv1alpha1.ApplicationDefinitionResourceSelector) bool {
|
|
sel, err := metav1.LabelSelectorAsSelector(&s.LabelSelector)
|
|
if err != nil {
|
|
log.FromContext(ctx).Error(err, "failed to convert label selector to selector")
|
|
return false
|
|
}
|
|
labelMatches := sel.Matches(labels.Set(l))
|
|
nameMatches := matchName(ctx, name, templateContext, s.ResourceNames)
|
|
return labelMatches && nameMatches
|
|
}
|
|
|
|
func matchResourceToSelectorArray(ctx context.Context, name string, templateContext, l map[string]string, ss []*cozyv1alpha1.ApplicationDefinitionResourceSelector) bool {
|
|
for _, s := range ss {
|
|
if matchResourceToSelector(ctx, name, templateContext, l, s) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func matchResourceToExcludeInclude(ctx context.Context, name string, templateContext, l map[string]string, resources *cozyv1alpha1.ApplicationDefinitionResources) bool {
|
|
if resources == nil {
|
|
return false
|
|
}
|
|
if matchResourceToSelectorArray(ctx, name, templateContext, l, resources.Exclude) {
|
|
return false
|
|
}
|
|
return matchResourceToSelectorArray(ctx, name, templateContext, l, resources.Include)
|
|
}
|