mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-31 03:45:17 +00:00
Fixes in new operators (#2704)
* fixes in operators to in many-to-one comparison Signed-off-by: anushkamittal20 <anumittal4641@gmail.com> * corrected allnotin Signed-off-by: anushkamittal20 <anumittal4641@gmail.com> * correction for duplicates Signed-off-by: anushkamittal20 <anumittal4641@gmail.com>
This commit is contained in:
parent
7d423f97c4
commit
497514fd94
4 changed files with 28 additions and 11 deletions
|
@ -265,6 +265,7 @@ func TestEvaluate(t *testing.T) {
|
|||
|
||||
// Any In
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "5.5.5.5"}, Operator: kyverno.AnyIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "5.5.5.5"}, Operator: kyverno.AnyIn, Value: "1.1.1.1"}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"4.4.4.4", "5.5.5.5"}, Operator: kyverno.AnyIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, false},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "5.5.5.5"}, Operator: kyverno.AnyIn, Value: []interface{}{"1.1.1.1"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{1, 2}, Operator: kyverno.AnyIn, Value: []interface{}{1, 2, 3, 4}}, true},
|
||||
|
@ -279,6 +280,7 @@ func TestEvaluate(t *testing.T) {
|
|||
{kyverno.Condition{Key: []interface{}{1, 2}, Operator: kyverno.AllIn, Value: []interface{}{1, 2, 3, 4}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{1, 5}, Operator: kyverno.AllIn, Value: []interface{}{1, 2, 3, 4}}, false},
|
||||
{kyverno.Condition{Key: []interface{}{5}, Operator: kyverno.AllIn, Value: []interface{}{1, 2, 3, 4}}, false},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "5.5.5.5"}, Operator: kyverno.AllIn, Value: "5.5.5.5"}, false},
|
||||
|
||||
// All Not In
|
||||
{kyverno.Condition{Key: 1, Operator: kyverno.AllNotIn, Value: []interface{}{1, 2, 3}}, false},
|
||||
|
@ -288,8 +290,11 @@ func TestEvaluate(t *testing.T) {
|
|||
{kyverno.Condition{Key: 5, Operator: kyverno.AllNotIn, Value: []interface{}{1, 2, 3}}, true},
|
||||
{kyverno.Condition{Key: 5.5, Operator: kyverno.AllNotIn, Value: []interface{}{1, 1.5, 2, 3}}, true},
|
||||
{kyverno.Condition{Key: "5", Operator: kyverno.AllNotIn, Value: []interface{}{"1", "2", "3"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "4.4.4.4"}, Operator: kyverno.AllNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, false},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "4.4.4.4"}, Operator: kyverno.AllNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "4.4.4.4"}, Operator: kyverno.AllNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3", "1.1.1.1"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "4.4.4.4", "1.1.1.1"}, Operator: kyverno.AllNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3", "1.1.1.1", "4.4.4.4"}}, false},
|
||||
{kyverno.Condition{Key: []interface{}{"5.5.5.5", "4.4.4.4"}, Operator: kyverno.AllNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "4.4.4.4"}, Operator: kyverno.AllNotIn, Value: "2.2.2.2"}, true},
|
||||
|
||||
// Any Not In
|
||||
{kyverno.Condition{Key: 1, Operator: kyverno.AnyNotIn, Value: []interface{}{1, 2, 3}}, false},
|
||||
|
@ -300,6 +305,7 @@ func TestEvaluate(t *testing.T) {
|
|||
{kyverno.Condition{Key: 5.5, Operator: kyverno.AnyNotIn, Value: []interface{}{1, 1.5, 2, 3}}, true},
|
||||
{kyverno.Condition{Key: "5", Operator: kyverno.AnyNotIn, Value: []interface{}{"1", "2", "3"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"1.1.1.1", "4.4.4.4"}, Operator: kyverno.AnyNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"5.5.5.5", "4.4.4.4"}, Operator: kyverno.AnyNotIn, Value: "4.4.4.4"}, true},
|
||||
{kyverno.Condition{Key: []interface{}{"5.5.5.5", "4.4.4.4"}, Operator: kyverno.AnyNotIn, Value: []interface{}{"1.1.1.1", "2.2.2.2", "3.3.3.3"}}, true},
|
||||
}
|
||||
|
||||
|
|
|
@ -84,9 +84,13 @@ func allSetExistsInArray(key []string, value interface{}, log logr.Logger, allNo
|
|||
}
|
||||
|
||||
var arr []string
|
||||
if err := json.Unmarshal([]byte(valuesAvailable), &arr); err != nil {
|
||||
log.Error(err, "failed to unmarshal value to JSON string array", "key", key, "value", value)
|
||||
return true, false
|
||||
if json.Valid([]byte(valuesAvailable)) {
|
||||
if err := json.Unmarshal([]byte(valuesAvailable), &arr); err != nil {
|
||||
log.Error(err, "failed to unmarshal value to JSON string array", "key", key, "value", value)
|
||||
return true, false
|
||||
}
|
||||
} else {
|
||||
arr = append(arr, valuesAvailable)
|
||||
}
|
||||
if allNotIn {
|
||||
return false, isAllNotIn(key, arr)
|
||||
|
@ -115,14 +119,17 @@ func isAllIn(key []string, value []string) bool {
|
|||
|
||||
// isAllNotIn checks if all the values in S1 are not in S2
|
||||
func isAllNotIn(key []string, value []string) bool {
|
||||
found := 0
|
||||
for _, valKey := range key {
|
||||
for _, valValue := range value {
|
||||
if wildcard.Match(valKey, valValue) {
|
||||
return false
|
||||
found++
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
return found != len(key)
|
||||
|
||||
}
|
||||
|
||||
func (allin AllInHandler) validateValueWithBoolPattern(_ bool, _ interface{}) bool {
|
||||
|
|
|
@ -86,9 +86,13 @@ func anySetExistsInArray(key []string, value interface{}, log logr.Logger, anyNo
|
|||
}
|
||||
|
||||
var arr []string
|
||||
if err := json.Unmarshal([]byte(valuesAvailable), &arr); err != nil {
|
||||
log.Error(err, "failed to unmarshal value to JSON string array", "key", key, "value", value)
|
||||
return true, false
|
||||
if json.Valid([]byte(valuesAvailable)) {
|
||||
if err := json.Unmarshal([]byte(valuesAvailable), &arr); err != nil {
|
||||
log.Error(err, "failed to unmarshal value to JSON string array", "key", key, "value", value)
|
||||
return true, false
|
||||
}
|
||||
} else {
|
||||
arr = append(arr, valuesAvailable)
|
||||
}
|
||||
if anyNotIn {
|
||||
return false, isAnyNotIn(key, arr)
|
||||
|
@ -113,7 +117,7 @@ func isAnyIn(key []string, value []string) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
// isAllNotIn checks if all the values in S1 are not in S2
|
||||
// isAnyNotIn checks if any of the values in S1 are not in S2
|
||||
func isAnyNotIn(key []string, value []string) bool {
|
||||
found := 0
|
||||
for _, valKey := range key {
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
|
||||
//NewAnyNotInHandler returns handler to manage AnyNotIn operations
|
||||
func NewAnyNotInHandler(log logr.Logger, ctx context.EvalInterface) OperatorHandler {
|
||||
return NotInHandler{
|
||||
return AnyNotInHandler{
|
||||
ctx: ctx,
|
||||
log: log,
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue