63 lines
2.1 KiB
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/configurableinterpreter/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)
|
|
}
|