Loading go-packages/meep-model/model_test.go +21 −9 File changed.Preview size limit exceeded, changes collapsed. Show changes go-packages/meep-model/validator.go +113 −7 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import ( "errors" "fmt" "regexp" "strconv" "strings" dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" Loading @@ -43,7 +44,7 @@ const ( REGEX_VARIABLE_NAME = `^(([_a-z0-9A-Z][_-a-z0-9.]*)?[_a-z0-9A-Z])+$` REGEX_MAC_ADDRESS = `^(([_a-f0-9A-F][_-a-f0-9]*)?[_a-f0-9A-F])+$` REGEX_WIRELESS_TYPE_LIST = `^((,\s*)?(wifi|5g|4g|other))+$` REGEX_PATH = `^[\^#%&$\*<>\?\{\|\} ]*$` REGEX_PATH = `[\^#%&$\*<>\?\{\|\} ]+` ) const ( Loading Loading @@ -84,7 +85,7 @@ var GPU_TYPE_ENUM = []string{"NVIDIA"} var PROTOCOL_ENUM = []string{"UDP", "TCP"} // Current validator version var ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 4} var ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 6} // Versions requiring scenario update var Version130 = semver.Version{Major: 1, Minor: 3, Patch: 0} Loading Loading @@ -595,13 +596,23 @@ func validateProc(proc *dataModel.Process) (err error) { // TODO - Validate placement identifier } else if proc.UserChartLocation != "" { // USER-DEFINE CHART APP // USER-DEFINED CHART APP // User Chart Location err = validatePath(proc.UserChartLocation, true) if err != nil { return err } // User Chart Group err = validateChartGroup(proc.UserChartGroup) if err != nil { return err } // User Chart Alternate values err = validatePath(proc.UserChartAlternateValues, false) if err != nil { return err } } else { // INTERNAL APP Loading Loading @@ -800,9 +811,19 @@ func validateMemoryConfig(cfg *dataModel.MemoryConfig) (err error) { func validateExternalConfig(cfg *dataModel.ExternalConfig) (err error) { // Ingress Service Mapping for _, svc := range cfg.IngressServiceMap { err = validateIngressSvc(&svc) if err != nil { return err } } // EgressServiceMapping for _, svc := range cfg.EgressServiceMap { err = validateEgressSvc(&svc) if err != nil { return err } } return nil } Loading Loading @@ -846,6 +867,91 @@ func validateServiceConfig(cfg *dataModel.ServiceConfig) (err error) { return nil } func validateChartGroup(group string) (err error) { if group != "" { fields := strings.Split(group, ":") if len(fields) != 4 { return errors.New("Group format must be 'svc instance:svc group name:port:protocol'") } // Svc name err = validateFullName(fields[0]) if err != nil { return err } // Svc group name err = validateName(fields[1]) if err != nil { return err } // Port port, err := strconv.Atoi(fields[2]) if err != nil { return err } err = validateInt32Range(int32(port), SERVICE_PORT_MIN, SERVICE_PORT_MAX) if err != nil { return err } // Protocol err = validateStringEnum(fields[3], PROTOCOL_ENUM) if err != nil { return err } } return nil } func validateIngressSvc(svc *dataModel.IngressService) (err error) { // External Port err = validateInt32Range(svc.ExternalPort, SERVICE_NODE_PORT_MIN, SERVICE_NODE_PORT_MAX) if err != nil { return err } // Svc name err = validateFullName(svc.Name) if err != nil { return err } // Port err = validateInt32Range(svc.Port, SERVICE_PORT_MIN, SERVICE_PORT_MAX) if err != nil { return err } // Protocol err = validateStringEnum(svc.Protocol, PROTOCOL_ENUM) if err != nil { return err } return nil } func validateEgressSvc(svc *dataModel.EgressService) (err error) { // Svc name err = validateFullName(svc.Name) if err != nil { return err } // Group Svc name err = validateFullName(svc.MeSvcName) if err != nil { return err } // Port err = validateInt32Range(svc.Port, SERVICE_PORT_MIN, SERVICE_PORT_MAX) if err != nil { return err } // Protocol err = validateStringEnum(svc.Protocol, PROTOCOL_ENUM) if err != nil { return err } // TODO -- Validate IP return nil } func validateName(name string) (err error) { if name == "" { return errors.New("Name not provided") Loading go-packages/meep-model/validator_test.go +206 −11 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import ( "fmt" "testing" dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) Loading Loading @@ -106,18 +105,214 @@ func TestValidateComponents(t *testing.T) { t.Fatalf(err.Error()) } // Int32 Range err = validateInt32Range(0, 1, 10) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateInt32Range(100, 1, 10) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateInt32Range(1, 1, 10) if err != nil { t.Fatalf(err.Error()) } err = validateInt32Range(10, 1, 10) if err != nil { t.Fatalf(err.Error()) } err = validateInt32Range(5, 1, 10) if err != nil { t.Fatalf(err.Error()) } func TestValidatePhyLoc(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Float32 Range err = validateFloat32Range(0.1, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat32Range(100.0, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat32Range(1.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat32Range(10.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat32Range(5.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } // Float64 Range err = validateFloat64Range(0.1, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat64Range(100.0, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat64Range(1.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat64Range(10.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat64Range(5.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } // Enum enumVals := []string{"val1", "val2", "val3"} err = validateStringEnum("", enumVals) if err == nil { t.Fatalf("String should not be in enum") } err = validateStringEnum("dummy", enumVals) if err == nil { t.Fatalf("String should not be in enum") } err = validateStringEnum("val1", enumVals) if err != nil { t.Fatalf(err.Error()) } err = validateStringEnum("val2", enumVals) if err != nil { t.Fatalf(err.Error()) } err = validateStringEnum("val3", enumVals) if err != nil { t.Fatalf(err.Error()) } // MAC Address err = validateMacAddress("badmac") if err == nil { t.Fatalf("MAC Address should be invalid") } err = validateMacAddress("11:22:33") if err == nil { t.Fatalf("MAC Address should be invalid") } err = validateMacAddress("11:22:33:44:55:66") if err == nil { t.Fatalf("MAC Address should be invalid") } err = validateMacAddress("") if err != nil { t.Fatalf(err.Error()) } err = validateMacAddress("0123456789ab") if err != nil { t.Fatalf(err.Error()) } err = validateMacAddress("CDEF01234567") if err != nil { t.Fatalf(err.Error()) } pl := dataModel.PhysicalLocation{Id: "", Name: "my-pl"} err := validatePhyLoc(&pl) // Wireless Type List err = validateWirelessTypeList("badtype") if err == nil { t.Fatalf("Wireless Type should be invalid") } err = validateWirelessTypeList("3g") if err == nil { t.Fatalf("Wireless Type should be invalid") } err = validateWirelessTypeList("4g,none") if err == nil { t.Fatalf("Wireless Type should be invalid") } err = validateWirelessTypeList("wifi") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("5g") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("4g") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("other") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("wifi,5g,4g,other") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("wifi, 4g, 5g") if err != nil { t.Fatalf(err.Error()) } // Path err = validatePath("", true) if err == nil { t.Fatalf("Path should be present") } err = validatePath("invalid path", true) if err == nil { t.Fatalf("Path should be invalid") } err = validatePath("", false) if err != nil { t.Fatalf(err.Error()) } err = validatePath("/valid/path", true) if err != nil { t.Fatalf(err.Error()) } err = validatePath("another/valid/path", true) if err != nil { t.Fatalf(err.Error()) } err = validatePath("registry:repo/name", true) if err != nil { t.Fatalf(err.Error()) } // Environment Variables err = validateEnvVar("INVALID VAR=value") if err == nil { t.Fatalf("Env var format should be invalid") } err = validateEnvVar("VAR=value,INVALID_VAR") if err == nil { t.Fatalf("Env var format should be invalid") } err = validateEnvVar("") if err != nil { t.Fatalf(err.Error()) } err = validateEnvVar("VAR=!@#$%^&*(),VAR2='val with spaces,VAR_NO_VAL=") if err != nil { t.Fatalf(err.Error()) } } func TestValidatePhyLoc(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // pl := dataModel.PhysicalLocation{Id: "", Name: "my-pl"} // err := validatePhyLoc(&pl) // if err != nil { // t.Fatalf(err.Error()) // } // Type_ string `json:"type,omitempty"` // // true: Physical location is external to MEEP false: Physical location is internal to MEEP // IsExternal bool `json:"isExternal,omitempty"` Loading Loading @@ -152,11 +347,11 @@ func TestValidateProc(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) pl := dataModel.Process{Id: "", Name: "my-proc"} err := validateProc(&pl) if err != nil { t.Fatalf(err.Error()) } // pl := dataModel.Process{Id: "", Name: "my-proc"} // err := validateProc(&pl) // if err != nil { // t.Fatalf(err.Error()) // } // // true: process is external to MEEP false: process is internal to MEEP // IsExternal bool `json:"isExternal,omitempty"` Loading Loading
go-packages/meep-model/model_test.go +21 −9 File changed.Preview size limit exceeded, changes collapsed. Show changes
go-packages/meep-model/validator.go +113 −7 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import ( "errors" "fmt" "regexp" "strconv" "strings" dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" Loading @@ -43,7 +44,7 @@ const ( REGEX_VARIABLE_NAME = `^(([_a-z0-9A-Z][_-a-z0-9.]*)?[_a-z0-9A-Z])+$` REGEX_MAC_ADDRESS = `^(([_a-f0-9A-F][_-a-f0-9]*)?[_a-f0-9A-F])+$` REGEX_WIRELESS_TYPE_LIST = `^((,\s*)?(wifi|5g|4g|other))+$` REGEX_PATH = `^[\^#%&$\*<>\?\{\|\} ]*$` REGEX_PATH = `[\^#%&$\*<>\?\{\|\} ]+` ) const ( Loading Loading @@ -84,7 +85,7 @@ var GPU_TYPE_ENUM = []string{"NVIDIA"} var PROTOCOL_ENUM = []string{"UDP", "TCP"} // Current validator version var ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 4} var ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 6} // Versions requiring scenario update var Version130 = semver.Version{Major: 1, Minor: 3, Patch: 0} Loading Loading @@ -595,13 +596,23 @@ func validateProc(proc *dataModel.Process) (err error) { // TODO - Validate placement identifier } else if proc.UserChartLocation != "" { // USER-DEFINE CHART APP // USER-DEFINED CHART APP // User Chart Location err = validatePath(proc.UserChartLocation, true) if err != nil { return err } // User Chart Group err = validateChartGroup(proc.UserChartGroup) if err != nil { return err } // User Chart Alternate values err = validatePath(proc.UserChartAlternateValues, false) if err != nil { return err } } else { // INTERNAL APP Loading Loading @@ -800,9 +811,19 @@ func validateMemoryConfig(cfg *dataModel.MemoryConfig) (err error) { func validateExternalConfig(cfg *dataModel.ExternalConfig) (err error) { // Ingress Service Mapping for _, svc := range cfg.IngressServiceMap { err = validateIngressSvc(&svc) if err != nil { return err } } // EgressServiceMapping for _, svc := range cfg.EgressServiceMap { err = validateEgressSvc(&svc) if err != nil { return err } } return nil } Loading Loading @@ -846,6 +867,91 @@ func validateServiceConfig(cfg *dataModel.ServiceConfig) (err error) { return nil } func validateChartGroup(group string) (err error) { if group != "" { fields := strings.Split(group, ":") if len(fields) != 4 { return errors.New("Group format must be 'svc instance:svc group name:port:protocol'") } // Svc name err = validateFullName(fields[0]) if err != nil { return err } // Svc group name err = validateName(fields[1]) if err != nil { return err } // Port port, err := strconv.Atoi(fields[2]) if err != nil { return err } err = validateInt32Range(int32(port), SERVICE_PORT_MIN, SERVICE_PORT_MAX) if err != nil { return err } // Protocol err = validateStringEnum(fields[3], PROTOCOL_ENUM) if err != nil { return err } } return nil } func validateIngressSvc(svc *dataModel.IngressService) (err error) { // External Port err = validateInt32Range(svc.ExternalPort, SERVICE_NODE_PORT_MIN, SERVICE_NODE_PORT_MAX) if err != nil { return err } // Svc name err = validateFullName(svc.Name) if err != nil { return err } // Port err = validateInt32Range(svc.Port, SERVICE_PORT_MIN, SERVICE_PORT_MAX) if err != nil { return err } // Protocol err = validateStringEnum(svc.Protocol, PROTOCOL_ENUM) if err != nil { return err } return nil } func validateEgressSvc(svc *dataModel.EgressService) (err error) { // Svc name err = validateFullName(svc.Name) if err != nil { return err } // Group Svc name err = validateFullName(svc.MeSvcName) if err != nil { return err } // Port err = validateInt32Range(svc.Port, SERVICE_PORT_MIN, SERVICE_PORT_MAX) if err != nil { return err } // Protocol err = validateStringEnum(svc.Protocol, PROTOCOL_ENUM) if err != nil { return err } // TODO -- Validate IP return nil } func validateName(name string) (err error) { if name == "" { return errors.New("Name not provided") Loading
go-packages/meep-model/validator_test.go +206 −11 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import ( "fmt" "testing" dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) Loading Loading @@ -106,18 +105,214 @@ func TestValidateComponents(t *testing.T) { t.Fatalf(err.Error()) } // Int32 Range err = validateInt32Range(0, 1, 10) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateInt32Range(100, 1, 10) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateInt32Range(1, 1, 10) if err != nil { t.Fatalf(err.Error()) } err = validateInt32Range(10, 1, 10) if err != nil { t.Fatalf(err.Error()) } err = validateInt32Range(5, 1, 10) if err != nil { t.Fatalf(err.Error()) } func TestValidatePhyLoc(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Float32 Range err = validateFloat32Range(0.1, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat32Range(100.0, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat32Range(1.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat32Range(10.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat32Range(5.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } // Float64 Range err = validateFloat64Range(0.1, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat64Range(100.0, 1.0, 10.0) if err == nil { t.Fatalf("Int32 should be out of range") } err = validateFloat64Range(1.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat64Range(10.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } err = validateFloat64Range(5.0, 1.0, 10.0) if err != nil { t.Fatalf(err.Error()) } // Enum enumVals := []string{"val1", "val2", "val3"} err = validateStringEnum("", enumVals) if err == nil { t.Fatalf("String should not be in enum") } err = validateStringEnum("dummy", enumVals) if err == nil { t.Fatalf("String should not be in enum") } err = validateStringEnum("val1", enumVals) if err != nil { t.Fatalf(err.Error()) } err = validateStringEnum("val2", enumVals) if err != nil { t.Fatalf(err.Error()) } err = validateStringEnum("val3", enumVals) if err != nil { t.Fatalf(err.Error()) } // MAC Address err = validateMacAddress("badmac") if err == nil { t.Fatalf("MAC Address should be invalid") } err = validateMacAddress("11:22:33") if err == nil { t.Fatalf("MAC Address should be invalid") } err = validateMacAddress("11:22:33:44:55:66") if err == nil { t.Fatalf("MAC Address should be invalid") } err = validateMacAddress("") if err != nil { t.Fatalf(err.Error()) } err = validateMacAddress("0123456789ab") if err != nil { t.Fatalf(err.Error()) } err = validateMacAddress("CDEF01234567") if err != nil { t.Fatalf(err.Error()) } pl := dataModel.PhysicalLocation{Id: "", Name: "my-pl"} err := validatePhyLoc(&pl) // Wireless Type List err = validateWirelessTypeList("badtype") if err == nil { t.Fatalf("Wireless Type should be invalid") } err = validateWirelessTypeList("3g") if err == nil { t.Fatalf("Wireless Type should be invalid") } err = validateWirelessTypeList("4g,none") if err == nil { t.Fatalf("Wireless Type should be invalid") } err = validateWirelessTypeList("wifi") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("5g") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("4g") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("other") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("wifi,5g,4g,other") if err != nil { t.Fatalf(err.Error()) } err = validateWirelessTypeList("wifi, 4g, 5g") if err != nil { t.Fatalf(err.Error()) } // Path err = validatePath("", true) if err == nil { t.Fatalf("Path should be present") } err = validatePath("invalid path", true) if err == nil { t.Fatalf("Path should be invalid") } err = validatePath("", false) if err != nil { t.Fatalf(err.Error()) } err = validatePath("/valid/path", true) if err != nil { t.Fatalf(err.Error()) } err = validatePath("another/valid/path", true) if err != nil { t.Fatalf(err.Error()) } err = validatePath("registry:repo/name", true) if err != nil { t.Fatalf(err.Error()) } // Environment Variables err = validateEnvVar("INVALID VAR=value") if err == nil { t.Fatalf("Env var format should be invalid") } err = validateEnvVar("VAR=value,INVALID_VAR") if err == nil { t.Fatalf("Env var format should be invalid") } err = validateEnvVar("") if err != nil { t.Fatalf(err.Error()) } err = validateEnvVar("VAR=!@#$%^&*(),VAR2='val with spaces,VAR_NO_VAL=") if err != nil { t.Fatalf(err.Error()) } } func TestValidatePhyLoc(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // pl := dataModel.PhysicalLocation{Id: "", Name: "my-pl"} // err := validatePhyLoc(&pl) // if err != nil { // t.Fatalf(err.Error()) // } // Type_ string `json:"type,omitempty"` // // true: Physical location is external to MEEP false: Physical location is internal to MEEP // IsExternal bool `json:"isExternal,omitempty"` Loading Loading @@ -152,11 +347,11 @@ func TestValidateProc(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) pl := dataModel.Process{Id: "", Name: "my-proc"} err := validateProc(&pl) if err != nil { t.Fatalf(err.Error()) } // pl := dataModel.Process{Id: "", Name: "my-proc"} // err := validateProc(&pl) // if err != nil { // t.Fatalf(err.Error()) // } // // true: process is external to MEEP false: process is internal to MEEP // IsExternal bool `json:"isExternal,omitempty"` Loading