1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-29 10:55:05 +00:00

I have finished implementing validation logic using TDD

This commit is contained in:
Maxim Goncharenko 2019-05-17 14:03:06 +03:00
parent e580c5e0ac
commit 0a486a7f54
2 changed files with 213 additions and 4 deletions

View file

@ -4,6 +4,8 @@ import (
"encoding/json"
"fmt"
"log"
"strconv"
"strings"
"github.com/minio/minio/pkg/wildcard"
@ -11,6 +13,19 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// TODO: This operators are already implemented in kubernetes
type Operator string
const (
MoreEqual Operator = ">="
LessEqual Operator = "<="
NotEqual Operator = "!="
More Operator = ">"
Less Operator = "<"
)
// TODO: Refactor using State pattern
// Validate handles validating admission request
// Checks the target resourse for rules defined in the policy
func Validate(policy kubepolicy.Policy, rawResource []byte, gvk metav1.GroupVersionKind) bool {
@ -228,8 +243,80 @@ func checkForWildcard(value, pattern string) bool {
return wildcard.Match(pattern, value)
}
func checkSingleOperator(value float64, operator string) bool {
if operatorVal, err := strconv.ParseFloat(operator, 64); err == nil {
return value == operatorVal
}
if len(operator) < 2 {
fmt.Printf("Validating error: operator can't have less than 2 characters: %s\n", operator)
return false
}
if operator[:len(MoreEqual)] == string(MoreEqual) {
operatorVal, err := strconv.ParseFloat(operator[len(MoreEqual):len(operator)], 64)
if err != nil {
fmt.Printf("Validating error: failed to parse operator value: %s\n", operator)
return false
}
return value >= operatorVal
}
if operator[:len(LessEqual)] == string(LessEqual) {
operatorVal, err := strconv.ParseFloat(operator[len(LessEqual):len(operator)], 64)
if err != nil {
fmt.Printf("Validating error: failed to parse operator value: %s\n", operator)
return false
}
return value <= operatorVal
}
if operator[:len(More)] == string(More) {
operatorVal, err := strconv.ParseFloat(operator[len(More):len(operator)], 64)
if err != nil {
fmt.Printf("Validating error: failed to parse operator value: %s\n", operator)
return false
}
return value > operatorVal
}
if operator[:len(Less)] == string(Less) {
operatorVal, err := strconv.ParseFloat(operator[len(Less):len(operator)], 64)
if err != nil {
fmt.Printf("Validating error: failed to parse operator value: %s\n", operator)
return false
}
return value < operatorVal
}
if operator[:len(NotEqual)] == string(NotEqual) {
operatorVal, err := strconv.ParseFloat(operator[len(NotEqual):len(operator)], 64)
if err != nil {
fmt.Printf("Validating error: failed to parse operator value: %s\n", operator)
return false
}
return value != operatorVal
}
return false
}
func checkForOperator(value float64, pattern string) bool {
return true
operators := strings.Split(pattern, "|")
for _, operator := range operators {
operator = strings.Replace(operator, " ", "", -1)
if checkSingleOperator(value, operator) {
return true
}
}
return false
}
func wrappedWithParentheses(str string) bool {

View file

@ -102,16 +102,138 @@ func TestCheckSingleValue_CheckFloat(t *testing.T) {
assert.Assert(t, !checkSingleValue(value, pattern))
}
func TestCheckSingleValue_CheckOperatorMore(t *testing.T) {
pattern := ">10"
func TestCheckSingleValue_CheckOperatorMoreEqual(t *testing.T) {
pattern := " >= 89 "
value := 89
assert.Assert(t, checkSingleValue(value, pattern))
pattern = ">10"
pattern = ">=10.0001"
floatValue := 89.901
assert.Assert(t, checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorMoreEqualFail(t *testing.T) {
pattern := " >= 90 "
value := 89
assert.Assert(t, !checkSingleValue(value, pattern))
pattern = ">=910.0001"
floatValue := 89.901
assert.Assert(t, !checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorLessEqual(t *testing.T) {
pattern := " <= 1 "
value := 1
assert.Assert(t, checkSingleValue(value, pattern))
pattern = "<=10.0001"
floatValue := 1.901
assert.Assert(t, checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorLessEqualFail(t *testing.T) {
pattern := " <= 0.1558 "
value := 1
assert.Assert(t, !checkSingleValue(value, pattern))
pattern = "<=10.0001"
floatValue := 12.901
assert.Assert(t, !checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorMore(t *testing.T) {
pattern := " > 10 "
value := 89
assert.Assert(t, checkSingleValue(value, pattern))
pattern = ">10.0001"
floatValue := 89.901
assert.Assert(t, checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorMoreFail(t *testing.T) {
pattern := " > 89 "
value := 89
assert.Assert(t, !checkSingleValue(value, pattern))
pattern = ">910.0001"
floatValue := 89.901
assert.Assert(t, !checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorLess(t *testing.T) {
pattern := " < 10 "
value := 9
assert.Assert(t, checkSingleValue(value, pattern))
pattern = "<10.0001"
floatValue := 9.901
assert.Assert(t, checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorLessFail(t *testing.T) {
pattern := " < 10 "
value := 10
assert.Assert(t, !checkSingleValue(value, pattern))
pattern = "<10.0001"
floatValue := 19.901
assert.Assert(t, !checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorNotEqual(t *testing.T) {
pattern := " != 10 "
value := 9.99999
assert.Assert(t, checkSingleValue(value, pattern))
pattern = "!=10.0001"
floatValue := 10.0000
assert.Assert(t, checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorNotEqualFail(t *testing.T) {
pattern := " != 9.99999 "
value := 9.99999
assert.Assert(t, !checkSingleValue(value, pattern))
pattern = "!=10"
floatValue := 10
assert.Assert(t, !checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorEqual(t *testing.T) {
pattern := " 10.000001 "
value := 10.000001
assert.Assert(t, checkSingleValue(value, pattern))
pattern = "10.000000"
floatValue := 10
assert.Assert(t, checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckOperatorEqualFail(t *testing.T) {
pattern := " 10.000000 "
value := 10.000001
assert.Assert(t, !checkSingleValue(value, pattern))
pattern = "10.000001"
floatValue := 10
assert.Assert(t, !checkSingleValue(floatValue, pattern))
}
func TestCheckSingleValue_CheckSeveralOperators(t *testing.T) {
pattern := " <-1 | 10.000001 "
value := 10.000001
assert.Assert(t, checkSingleValue(value, pattern))
value = -30
assert.Assert(t, checkSingleValue(value, pattern))
value = 5
assert.Assert(t, !checkSingleValue(value, pattern))
}
func TestCheckSingleValue_CheckWildcard(t *testing.T) {
pattern := "nirmata_*"
value := "nirmata_awesome"