You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
336 lines
8.7 KiB
336 lines
8.7 KiB
package validators
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"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.
|
|
func computeDriverValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computeDriverValues)
|
|
}
|
|
|
|
// protoValidator is used to validate Proto fields.
|
|
func protoValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, protoValues)
|
|
}
|
|
|
|
// accessTypeValidator is used to validate AccessType fields.
|
|
func accessTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, accessTypeValues)
|
|
}
|
|
|
|
// resTypesValidator is used to validate ResTypes fields.
|
|
func resTypesValidator(fe validator.FieldLevel) bool {
|
|
fieldSlice, ok := fe.Field().Interface().([]string)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
for _, value := range fieldSlice {
|
|
if !IsInSlice(value, resTypesValues) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// driverValidator is used to validate Driver fields.
|
|
func driverValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, driverValues)
|
|
}
|
|
|
|
// accountCUTypeValidator is used to validate CUType field.
|
|
func accountCUTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, accountCUTypeValues)
|
|
}
|
|
|
|
// bserviceModeValidator is used to validate Mode field.
|
|
func bserviceModeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, bserviceModeValues)
|
|
}
|
|
|
|
// computeTopologyValidator is used to validate Topology field.
|
|
func computeTopologyValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computeTopologyValues)
|
|
}
|
|
|
|
// computePolicyValidator is used to validate Policy field.
|
|
func computePolicyValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computePolicyValues)
|
|
}
|
|
|
|
// computeModeValidator is used to validate Mode field.
|
|
func computeModeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computeModeValues)
|
|
}
|
|
|
|
// computeDiskTypeValidator is used to validate DiskType field.
|
|
func computeDiskTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computeDiskTypeValues)
|
|
}
|
|
|
|
// computeNetTypeValidator is used to validate NetType field.
|
|
func computeNetTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computeNetTypeValues)
|
|
}
|
|
|
|
// computeOrderValidator is used to validate Order field.
|
|
func computeOrderValidator(fe validator.FieldLevel) bool {
|
|
fieldSlice, ok := fe.Field().Interface().([]string)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
for _, value := range fieldSlice {
|
|
if !IsInSlice(value, computeOrderValues) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// computeDataDisksValidator is used to validate DataDisks field.
|
|
func computeDataDisksValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, computeDataDisksValues)
|
|
}
|
|
|
|
// diskTypeValidator is used to validate Type field.
|
|
func diskTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, diskTypeValues)
|
|
}
|
|
|
|
// flipgroupClientTypeValidator is used to validate ClientType field.
|
|
func flipgroupClientTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, flipgroupClientTypeValues)
|
|
}
|
|
|
|
// kvmNetTypeValidator is used to validate NetType field.
|
|
func kvmNetTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, kvmNetTypeValues)
|
|
}
|
|
|
|
// lbAlgorithmValidator is used to validate Algorithm field.
|
|
func lbAlgorithmValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, lbAlgorithmValues)
|
|
}
|
|
|
|
// rgDefNetValidator is used to validate DefNet field.
|
|
func rgDefNetValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, rgDefNetValues)
|
|
}
|
|
|
|
// rgNetTypeValidator is used to validate NetType field.
|
|
func rgNetTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, rgNetTypeValues)
|
|
}
|
|
|
|
// vinsTypeValidator is used to validate Type field.
|
|
func vinsTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, vinsTypeValues)
|
|
}
|
|
|
|
// imageBootTypeValidator is used to validate BootType field.
|
|
func imageBootTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, imageBootTypeValues)
|
|
}
|
|
|
|
// imageTypeValidator is used to validate ImageType field.
|
|
func imageTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, imageTypeValues)
|
|
}
|
|
|
|
// imageDriversValidator is used to validate Drivers field.
|
|
func imageDriversValidator(fe validator.FieldLevel) bool {
|
|
fieldSlice, ok := fe.Field().Interface().([]string)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
for _, item := range fieldSlice {
|
|
if !IsInSlice(item, imageDriversValues) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// imageArchitectureValidator is used to validate Architecture field.
|
|
func imageArchitectureValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, imageArchitectureValues)
|
|
}
|
|
|
|
// sepFieldTypeValidator is used to validate FieldType field.
|
|
func sepFieldTypeValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
return IsInSlice(fieldValue, sepFieldTypeValues)
|
|
}
|
|
|
|
// hwPathValidator is used to validate HWPath field.
|
|
func hwPathValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
|
|
ok, _ := regexp.MatchString(`^\b[0-9a-f]{4}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}.\d{1}$`, fieldValue)
|
|
|
|
return ok
|
|
}
|
|
|
|
// networkPluginValidator is used to validate NetworkPlugin field
|
|
func networkPluginValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
fieldValue = strings.ToLower(fieldValue)
|
|
|
|
return IsInSlice(fieldValue, networkPluginValues)
|
|
}
|
|
|
|
// networkPluginsValidator is used to validate NetworkPlugins field
|
|
func networkPluginsValidator(fe validator.FieldLevel) bool {
|
|
fieldSlice, ok := fe.Field().Interface().([]string)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
for _, item := range fieldSlice {
|
|
item = strings.ToLower(item)
|
|
|
|
if !IsInSlice(item, networkPluginValues) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func interfaceStateValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
fieldValue = strings.ToLower(fieldValue)
|
|
|
|
return IsInSlice(fieldValue, interfaceStateValues)
|
|
}
|
|
|
|
func strictLooseValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
fieldValue = strings.ToLower(fieldValue)
|
|
|
|
return IsInSlice(fieldValue, strictLooseValues)
|
|
}
|
|
|
|
// name workerGroup must be more 3 symbol
|
|
func workerGroupNameValidator(fe validator.FieldLevel) bool {
|
|
fieldValue := fe.Field().String()
|
|
fieldValue = strings.Trim(fieldValue, " ")
|
|
|
|
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 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)
|
|
}
|
|
|
|
// 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...)
|
|
}
|