2020-01-07 15:13:57 -08:00
package operator
import (
2021-02-06 09:19:23 +05:30
"strings"
2020-03-17 11:05:20 -07:00
"github.com/go-logr/logr"
2020-10-07 11:12:31 -07:00
kyverno "github.com/kyverno/kyverno/pkg/api/kyverno/v1"
"github.com/kyverno/kyverno/pkg/engine/context"
2020-01-07 15:13:57 -08:00
)
2020-01-24 12:05:53 -08:00
//OperatorHandler provides interface to manage types
2020-01-07 15:13:57 -08:00
type OperatorHandler interface {
2021-07-28 19:54:50 +03:00
Evaluate ( key , value interface { } ) bool
2020-11-28 23:29:15 -08:00
validateValueWithStringPattern ( key string , value interface { } ) bool
validateValueWithBoolPattern ( key bool , value interface { } ) bool
validateValueWithIntPattern ( key int64 , value interface { } ) bool
validateValueWithFloatPattern ( key float64 , value interface { } ) bool
2020-01-07 15:13:57 -08:00
validateValueWithMapPattern ( key map [ string ] interface { } , value interface { } ) bool
validateValueWithSlicePattern ( key [ ] interface { } , value interface { } ) bool
}
2020-01-24 12:05:53 -08:00
//VariableSubstitutionHandler defines the handler function for variable substitution
2020-03-17 11:05:20 -07:00
type VariableSubstitutionHandler = func ( log logr . Logger , ctx context . EvalInterface , pattern interface { } ) ( interface { } , error )
2020-01-07 15:13:57 -08:00
2020-01-24 12:05:53 -08:00
//CreateOperatorHandler returns the operator handler based on the operator used in condition
2021-07-28 19:54:50 +03:00
func CreateOperatorHandler ( log logr . Logger , ctx context . EvalInterface , op kyverno . ConditionOperator ) OperatorHandler {
2020-10-29 15:00:22 -07:00
str := strings . ToLower ( string ( op ) )
switch str {
2021-10-19 15:22:26 +01:00
case strings . ToLower ( string ( kyverno . Equal ) ) ,
strings . ToLower ( string ( kyverno . Equals ) ) :
2021-07-28 19:54:50 +03:00
return NewEqualHandler ( log , ctx )
2020-10-29 15:00:22 -07:00
2021-10-19 15:22:26 +01:00
case strings . ToLower ( string ( kyverno . NotEqual ) ) ,
strings . ToLower ( string ( kyverno . NotEquals ) ) :
2021-07-28 19:54:50 +03:00
return NewNotEqualHandler ( log , ctx )
2020-10-29 15:00:22 -07:00
2021-10-27 05:59:42 +05:30
// deprecated
2020-10-29 15:00:22 -07:00
case strings . ToLower ( string ( kyverno . In ) ) :
2021-07-28 19:54:50 +03:00
return NewInHandler ( log , ctx )
2020-10-29 15:00:22 -07:00
2021-10-27 05:59:42 +05:30
case strings . ToLower ( string ( kyverno . AnyIn ) ) :
return NewAnyInHandler ( log , ctx )
case strings . ToLower ( string ( kyverno . AllIn ) ) :
return NewAllInHandler ( log , ctx )
// deprecated
2020-10-29 15:00:22 -07:00
case strings . ToLower ( string ( kyverno . NotIn ) ) :
2021-07-28 19:54:50 +03:00
return NewNotInHandler ( log , ctx )
2020-10-29 15:00:22 -07:00
2021-10-27 05:59:42 +05:30
case strings . ToLower ( string ( kyverno . AnyNotIn ) ) :
return NewAnyNotInHandler ( log , ctx )
case strings . ToLower ( string ( kyverno . AllNotIn ) ) :
return NewAllNotInHandler ( log , ctx )
2021-02-06 09:19:23 +05:30
case strings . ToLower ( string ( kyverno . GreaterThanOrEquals ) ) ,
strings . ToLower ( string ( kyverno . GreaterThan ) ) ,
strings . ToLower ( string ( kyverno . LessThanOrEquals ) ) ,
strings . ToLower ( string ( kyverno . LessThan ) ) :
2021-07-28 19:54:50 +03:00
return NewNumericOperatorHandler ( log , ctx , op )
2021-02-06 09:19:23 +05:30
2021-07-30 16:11:52 -04:00
case strings . ToLower ( string ( kyverno . DurationGreaterThanOrEquals ) ) ,
strings . ToLower ( string ( kyverno . DurationGreaterThan ) ) ,
strings . ToLower ( string ( kyverno . DurationLessThanOrEquals ) ) ,
strings . ToLower ( string ( kyverno . DurationLessThan ) ) :
2021-10-22 20:41:25 +01:00
log . Info ( "DEPRECATED: The Duration* operators have been replaced with the other existing operators that now also support duration values" , "operator" , str )
2021-07-30 16:11:52 -04:00
return NewDurationOperatorHandler ( log , ctx , op )
2020-01-07 15:13:57 -08:00
default :
2020-10-29 15:00:22 -07:00
log . Info ( "operator not supported" , "operator" , str )
2020-01-07 15:13:57 -08:00
}
2020-10-29 15:00:22 -07:00
2020-01-07 15:13:57 -08:00
return nil
}