mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-05 15:37:19 +00:00
* initial commit * variable substitution * update tests * update test * refactor engine packages for validate & generate * update vendor * update toml * support variable substitution in overlay mutation * missing update * fix indentation in logs * store context values as single JSON document using merge patches. * remove duplicate functions * fix message string * Handle processing of policies in background (#569) * remove condition check while generating mutation patch as conditions are verified in the first iteration * initial commit * background policy validation * correct message * skip non-background policy process for add/update * fix order to correct policy registration * update comment Co-authored-by: shuting <shutting06@gmail.com> * refactor Co-authored-by: shuting <shutting06@gmail.com>
69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
package variables
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
)
|
|
|
|
//CheckVariables checks if the variable regex has been used
|
|
func CheckVariables(pattern interface{}, variables []string, path string) error {
|
|
switch typedPattern := pattern.(type) {
|
|
case map[string]interface{}:
|
|
return checkMap(typedPattern, variables, path)
|
|
case []interface{}:
|
|
return checkArray(typedPattern, variables, path)
|
|
case string:
|
|
return checkValue(typedPattern, variables, path)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func checkMap(patternMap map[string]interface{}, variables []string, path string) error {
|
|
for patternKey, patternElement := range patternMap {
|
|
|
|
if err := CheckVariables(patternElement, variables, path+patternKey+"/"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func checkArray(patternList []interface{}, variables []string, path string) error {
|
|
for idx, patternElement := range patternList {
|
|
if err := CheckVariables(patternElement, variables, path+strconv.Itoa(idx)+"/"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func checkValue(valuePattern string, variables []string, path string) error {
|
|
operatorVariable := getOperator(valuePattern)
|
|
variable := valuePattern[len(operatorVariable):]
|
|
if checkValueVariable(variable, variables) {
|
|
return fmt.Errorf(path + valuePattern)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func checkValueVariable(valuePattern string, variables []string) bool {
|
|
variableRegex := regexp.MustCompile("^{{(.*)}}$")
|
|
groups := variableRegex.FindStringSubmatch(valuePattern)
|
|
if len(groups) < 2 {
|
|
return false
|
|
}
|
|
return variablePatternSearch(groups[1], variables)
|
|
}
|
|
|
|
func variablePatternSearch(pattern string, regexs []string) bool {
|
|
for _, regex := range regexs {
|
|
varRegex := regexp.MustCompile(regex)
|
|
found := varRegex.FindString(pattern)
|
|
if found != "" {
|
|
return true
|
|
}
|
|
}
|
|
return true
|
|
}
|