karmada/pkg/webhook/resourceinterpretercustomiz.../helper.go

63 lines
2.1 KiB
Go

package resourceinterpretercustomization
import (
"context"
"fmt"
"time"
configv1alpha1 "github.com/karmada-io/karmada/pkg/apis/config/v1alpha1"
"github.com/karmada-io/karmada/pkg/resourceinterpreter/customized/declarative/luavm"
"github.com/karmada-io/karmada/pkg/util/interpreter"
)
func validateCustomizationRule(oldRules, newRules *configv1alpha1.ResourceInterpreterCustomization) error {
if oldRules.Spec.Target.APIVersion != newRules.Spec.Target.APIVersion ||
oldRules.Spec.Target.Kind != newRules.Spec.Target.Kind {
return nil
}
for _, rule := range interpreter.AllResourceInterpreterCustomizationRules {
// skip InterpretDependency operation because it supports multiple rules.
if rule.Name() == string(configv1alpha1.InterpreterOperationInterpretDependency) {
continue
}
oldScript := rule.GetScript(oldRules)
newScript := rule.GetScript(newRules)
if oldScript != "" && newScript != "" {
return fmt.Errorf("conflicting with InterpreterOperation(%s) of existing ResourceInterpreterCustomization(%s)", rule.Name(), oldRules.Name)
}
}
return nil
}
func checkCustomizationsRule(customization *configv1alpha1.ResourceInterpreterCustomization) error {
ctx, cancel := context.WithTimeout(context.TODO(), time.Second)
defer cancel()
l, err := luavm.NewWithContext(ctx)
if err != nil {
return err
}
defer l.Close()
for _, rule := range interpreter.AllResourceInterpreterCustomizationRules {
if script := rule.GetScript(customization); script != "" {
if _, err = l.LoadString(script); err != nil {
return fmt.Errorf("InterpreterOperation(%s) Lua script error: %v", rule.Name(), err)
}
}
}
return nil
}
func validateResourceInterpreterCustomizations(newConfig *configv1alpha1.ResourceInterpreterCustomization, customizations *configv1alpha1.ResourceInterpreterCustomizationList) error {
for _, config := range customizations.Items {
// skip self verification
if config.Name == newConfig.Name {
continue
}
oldConfig := config
if err := validateCustomizationRule(&oldConfig, newConfig); err != nil {
return err
}
}
return checkCustomizationsRule(newConfig)
}