@ -1,31 +1,37 @@
package validators
package validators
import (
import (
"errors"
"fmt"
"net/url"
"reflect"
"regexp"
"regexp"
"strings"
"strings"
"github.com/go-playground/validator/v10"
"github.com/go-playground/validator/v10"
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/multierror"
)
)
// computeDriverValidator is used to validate Driver field in kvmx86 /kvmppc create.
// computeDriverValidator is used to validate Driver field in kvmx86 create.
func computeDriverValidator ( fe validator . FieldLevel ) bool {
func computeDriverValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , computeDriverValues )
return Is InSlice( fieldValue , computeDriverValues )
}
}
// protoValidator is used to validate Proto fields.
// protoValidator is used to validate Proto fields.
func protoValidator ( fe validator . FieldLevel ) bool {
func protoValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , protoValues )
return Is InSlice( fieldValue , protoValues )
}
}
// accessTypeValidator is used to validate AccessType fields.
// accessTypeValidator is used to validate AccessType fields.
func accessTypeValidator ( fe validator . FieldLevel ) bool {
func accessTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , accessTypeValues )
return Is InSlice( fieldValue , accessTypeValues )
}
}
// resTypesValidator is used to validate ResTypes fields.
// resTypesValidator is used to validate ResTypes fields.
@ -36,7 +42,7 @@ func resTypesValidator(fe validator.FieldLevel) bool {
}
}
for _ , value := range fieldSlice {
for _ , value := range fieldSlice {
if ! String InSlice( value , resTypesValues ) {
if ! Is InSlice( value , resTypesValues ) {
return false
return false
}
}
}
}
@ -48,56 +54,63 @@ func resTypesValidator(fe validator.FieldLevel) bool {
func driverValidator ( fe validator . FieldLevel ) bool {
func driverValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , driverValues )
return Is InSlice( fieldValue , driverValues )
}
}
// accountCUTypeValidator is used to validate CUType field.
// accountCUTypeValidator is used to validate CUType field.
func accountCUTypeValidator ( fe validator . FieldLevel ) bool {
func accountCUTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , accountCUTypeValues )
return Is InSlice( fieldValue , accountCUTypeValues )
}
}
// bserviceModeValidator is used to validate Mode field.
// bserviceModeValidator is used to validate Mode field.
func bserviceModeValidator ( fe validator . FieldLevel ) bool {
func bserviceModeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , bserviceModeValues )
return Is InSlice( fieldValue , bserviceModeValues )
}
}
// computeTopologyValidator is used to validate Topology field.
// computeTopologyValidator is used to validate Topology field.
func computeTopologyValidator ( fe validator . FieldLevel ) bool {
func computeTopologyValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , computeTopologyValues )
return Is InSlice( fieldValue , computeTopologyValues )
}
}
// computePolicyValidator is used to validate Policy field.
// computePolicyValidator is used to validate Policy field.
func computePolicyValidator ( fe validator . FieldLevel ) bool {
func computePolicyValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , computePolicyValues )
return Is InSlice( fieldValue , computePolicyValues )
}
}
// computeModeValidator is used to validate Mode field.
// computeModeValidator is used to validate Mode field.
func computeModeValidator ( fe validator . FieldLevel ) bool {
func computeModeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , computeModeValues )
return Is InSlice( fieldValue , computeModeValues )
}
}
// computeDiskTypeValidator is used to validate DiskType field.
// computeDiskTypeValidator is used to validate DiskType field.
func computeDiskTypeValidator ( fe validator . FieldLevel ) bool {
func computeDiskTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , computeDiskTypeValues )
return Is InSlice( fieldValue , computeDiskTypeValues )
}
}
// computeNetTypeValidator is used to validate NetType field.
// computeNetTypeValidator is used to validate NetType field.
func computeNetTypeValidator ( fe validator . FieldLevel ) bool {
func computeNetTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return StringInSlice ( fieldValue , computeNetTypeValues )
return IsInSlice ( fieldValue , computeNetTypeValues )
}
// computex86NetTypeValidator is used to validate NetType field.
func computex86NetTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , computex86NetTypeValues )
}
}
// computeOrderValidator is used to validate Order field.
// computeOrderValidator is used to validate Order field.
@ -108,7 +121,7 @@ func computeOrderValidator(fe validator.FieldLevel) bool {
}
}
for _ , value := range fieldSlice {
for _ , value := range fieldSlice {
if ! String InSlice( value , computeOrderValues ) {
if ! Is InSlice( value , computeOrderValues ) {
return false
return false
}
}
}
}
@ -120,70 +133,70 @@ func computeOrderValidator(fe validator.FieldLevel) bool {
func computeDataDisksValidator ( fe validator . FieldLevel ) bool {
func computeDataDisksValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , computeDataDisksValues )
return Is InSlice( fieldValue , computeDataDisksValues )
}
}
// diskTypeValidator is used to validate Type field.
// diskTypeValidator is used to validate Type field.
func diskTypeValidator ( fe validator . FieldLevel ) bool {
func diskTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , diskTypeValues )
return Is InSlice( fieldValue , diskTypeValues )
}
}
// flipgroupClientTypeValidator is used to validate ClientType field.
// flipgroupClientTypeValidator is used to validate ClientType field.
func flipgroupClientTypeValidator ( fe validator . FieldLevel ) bool {
func flipgroupClientTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , flipgroupClientTypeValues )
return Is InSlice( fieldValue , flipgroupClientTypeValues )
}
}
// kvmNetTypeValidator is used to validate NetType field.
// kvmNetTypeValidator is used to validate NetType field.
func kvmNetTypeValidator ( fe validator . FieldLevel ) bool {
func kvmNetTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , kvmNetTypeValues )
return Is InSlice( fieldValue , kvmNetTypeValues )
}
}
// lbAlgorithmValidator is used to validate Algorithm field.
// lbAlgorithmValidator is used to validate Algorithm field.
func lbAlgorithmValidator ( fe validator . FieldLevel ) bool {
func lbAlgorithmValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , lbAlgorithmValues )
return Is InSlice( fieldValue , lbAlgorithmValues )
}
}
// rgDefNetValidator is used to validate DefNet field.
// rgDefNetValidator is used to validate DefNet field.
func rgDefNetValidator ( fe validator . FieldLevel ) bool {
func rgDefNetValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , rgDefNetValues )
return Is InSlice( fieldValue , rgDefNetValues )
}
}
// rgNetTypeValidator is used to validate NetType field.
// rgNetTypeValidator is used to validate NetType field.
func rgNetTypeValidator ( fe validator . FieldLevel ) bool {
func rgNetTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , rgNetTypeValues )
return Is InSlice( fieldValue , rgNetTypeValues )
}
}
// vinsTypeValidator is used to validate Type field.
// vinsTypeValidator is used to validate Type field.
func vinsTypeValidator ( fe validator . FieldLevel ) bool {
func vinsTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , vinsTypeValues )
return Is InSlice( fieldValue , vinsTypeValues )
}
}
// imageBootTypeValidator is used to validate BootType field.
// imageBootTypeValidator is used to validate BootType field.
func imageBootTypeValidator ( fe validator . FieldLevel ) bool {
func imageBootTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , imageBootTypeValues )
return Is InSlice( fieldValue , imageBootTypeValues )
}
}
// imageTypeValidator is used to validate ImageType field.
// imageTypeValidator is used to validate ImageType field.
func imageTypeValidator ( fe validator . FieldLevel ) bool {
func imageTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , imageTypeValues )
return Is InSlice( fieldValue , imageTypeValues )
}
}
// imageDriversValidator is used to validate Drivers field.
// imageDriversValidator is used to validate Drivers field.
@ -194,7 +207,7 @@ func imageDriversValidator(fe validator.FieldLevel) bool {
}
}
for _ , item := range fieldSlice {
for _ , item := range fieldSlice {
if ! String InSlice( item , imageDriversValues ) {
if ! Is InSlice( item , imageDriversValues ) {
return false
return false
}
}
}
}
@ -206,14 +219,14 @@ func imageDriversValidator(fe validator.FieldLevel) bool {
func imageArchitectureValidator ( fe validator . FieldLevel ) bool {
func imageArchitectureValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , imageArchitectureValues )
return Is InSlice( fieldValue , imageArchitectureValues )
}
}
// sepFieldTypeValidator is used to validate FieldType field.
// sepFieldTypeValidator is used to validate FieldType field.
func sepFieldTypeValidator ( fe validator . FieldLevel ) bool {
func sepFieldTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
return String InSlice( fieldValue , sepFieldTypeValues )
return Is InSlice( fieldValue , sepFieldTypeValues )
}
}
// hwPathValidator is used to validate HWPath field.
// hwPathValidator is used to validate HWPath field.
@ -230,7 +243,7 @@ func networkPluginValidator(fe validator.FieldLevel) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
fieldValue = strings . ToLower ( fieldValue )
fieldValue = strings . ToLower ( fieldValue )
return String InSlice( fieldValue , networkPluginValues )
return Is InSlice( fieldValue , networkPluginValues )
}
}
// networkPluginsValidator is used to validate NetworkPlugins field
// networkPluginsValidator is used to validate NetworkPlugins field
@ -243,7 +256,7 @@ func networkPluginsValidator(fe validator.FieldLevel) bool {
for _ , item := range fieldSlice {
for _ , item := range fieldSlice {
item = strings . ToLower ( item )
item = strings . ToLower ( item )
if ! String InSlice( item , networkPluginValues ) {
if ! Is InSlice( item , networkPluginValues ) {
return false
return false
}
}
}
}
@ -255,14 +268,35 @@ func interfaceStateValidator(fe validator.FieldLevel) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
fieldValue = strings . ToLower ( fieldValue )
fieldValue = strings . ToLower ( fieldValue )
return StringInSlice ( fieldValue , interfaceStateValues )
return IsInSlice ( fieldValue , interfaceStateValues )
}
func interfaceTXModelValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue = strings . ToLower ( fieldValue )
return IsInSlice ( fieldValue , txModelValues )
}
func interfaceIOEventFDValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue = strings . ToLower ( fieldValue )
return IsInSlice ( fieldValue , ioEventFDValues )
}
func interfaceEventIDxValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue = strings . ToLower ( fieldValue )
return IsInSlice ( fieldValue , eventIDxValues )
}
}
func strictLooseValidator ( fe validator . FieldLevel ) bool {
func strictLooseValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
fieldValue := fe . Field ( ) . String ( )
fieldValue = strings . ToLower ( fieldValue )
fieldValue = strings . ToLower ( fieldValue )
return StringInSlice ( fieldValue , strictLooseValues )
return Is InSlice( fieldValue , strictLooseValues )
}
}
// name workerGroup must be more 3 symbol
// name workerGroup must be more 3 symbol
@ -272,3 +306,111 @@ func workerGroupNameValidator(fe validator.FieldLevel) bool {
return len ( fieldValue ) >= 3
return len ( fieldValue ) >= 3
}
}
func sortByValidator ( fe validator . FieldLevel ) bool {
sortByRegexp := regexp . MustCompile ( ` ^[+-][a-zA-Z_]+ ` )
return sortByRegexp . MatchString ( fe . Field ( ) . String ( ) )
}
func actionValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , actionValues )
}
func vmActionValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , vmActionValues )
}
func mtuValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . Uint ( )
return fieldValue >= uint64 ( mtuMin ) && fieldValue <= uint64 ( mtuMax )
}
func computeFeaturesValidator ( fe validator . FieldLevel ) bool {
field := fe . Field ( )
slice , ok := field . Interface ( ) . ( [ ] string )
if ! ok {
return false
}
return IsSubSlice ( slice , computeFeaturesValues )
}
func networkInterfaceNamingValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , networkInterfaceNamingValues )
}
func numaAffinityValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , numaAffinityValues )
}
// kvmx86NetTypeValidator is used to validate NetType field for x86 compute.
func kvmx86NetTypeValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , kvmx86NetTypeValues )
}
func isBoolTypeValidator ( fe validator . FieldLevel ) bool {
return fe . Field ( ) . CanConvert ( reflect . TypeOf ( true ) )
}
func urlValidartor ( fl validator . FieldLevel ) bool {
fieldValues := fl . Field ( ) . String ( )
_ , err := url . ParseRequestURI ( fieldValues )
return err == nil
}
func chipsetValidator ( fe validator . FieldLevel ) bool {
fieldValue := fe . Field ( ) . String ( )
return IsInSlice ( fieldValue , chipsetValues )
}
func preferredCPUValidator ( fe validator . FieldLevel ) bool {
fieldSlice , ok := fe . Field ( ) . Interface ( ) . ( [ ] int64 )
if ! ok {
return false
}
for _ , value := range fieldSlice {
if value < - 1 {
return false
}
}
return true
}
// ValidateRAM checks if request contains RAM value that is positive integer divisible by divisibility passed.
// It is recommended to pass constants.RAM_DIVISIBILITY as divisility arguement
func ValidateRAM ( r interfaces . RequestWithRAM , divisibility uint64 ) error {
if divisibility == 0 {
return errors . New ( "second argument of ValidateRAM should be greater than 0" )
}
mapRAM := r . GetRAM ( )
errs := make ( [ ] error , 0 , len ( mapRAM ) )
for k , v := range mapRAM {
if v % divisibility != 0 {
errs = append ( errs , fmt . Errorf ( "expected value of %s: \"%d\" should be divisible by %d" , k , v , divisibility ) )
}
}
return multierror . Join ( errs ... )
}