//validate ServiceDefinition configuration and any embedded ServiceDefinitions func (sd *ServiceDefinition) validate(context *validationContext) error { //TODO: check name, description, config files. //Check MinMax settings if err := sd.Instances.Validate(); err != nil { return fmt.Errorf("service Definition %v: %v", sd.Name, err) } if err := validation.StringIn(sd.Launch, commons.AUTO, commons.MANUAL); err != nil { return fmt.Errorf("service definition %v: invalid launch setting %v", sd.Name, err) } //validate endpoint config names := make(map[string]struct{}) for _, se := range sd.Endpoints { if err := se.ValidEntity(); err != nil { return fmt.Errorf("service definition %v: %v", sd.Name, err) } if err := context.validateVHost(se); err != nil { return fmt.Errorf("service definition %v: %v", sd.Name, err) } //enable unique endpoint name validation trimName := strings.Trim(se.Name, " ") if _, found := names[trimName]; found { return fmt.Errorf("service definition %v: Endpoint name %s not unique in service definition", sd.Name, trimName) } names[trimName] = struct{}{} } //TODO: validate LogConfigs return validServiceDefinitions(&sd.Services, context) }
//ValidEntity validate that Service has all required fields func (s *Service) ValidEntity() error { vErr := validation.NewValidationError() vErr.Add(validation.NotEmpty("ID", s.ID)) vErr.Add(validation.NotEmpty("Name", s.Name)) vErr.Add(validation.NotEmpty("PoolID", s.PoolID)) vErr.Add(validation.StringIn(s.Launch, commons.AUTO, commons.MANUAL)) vErr.Add(validation.IntIn(s.DesiredState, int(SVCRun), int(SVCStop), int(SVCPause))) // Validate the min/max/default instances vErr.Add(s.InstanceLimits.Validate()) if s.Instances != 0 { if s.InstanceLimits.Max != 0 { if s.Instances < s.InstanceLimits.Min || s.Instances > s.InstanceLimits.Max { vErr.Add(fmt.Errorf("Instance count (%d) must be in InstanceLimits range [%d-%d]", s.Instances, s.InstanceLimits.Min, s.InstanceLimits.Max)) } } else if s.Instances < s.InstanceLimits.Min { vErr.Add(fmt.Errorf("Instance count (%d) must be greater than InstanceLimits min %d", s.Instances, s.InstanceLimits.Min)) } } if vErr.HasError() { return vErr } return nil }
//ValidEntity used to make sure AddressResourceConfig is in a valid state func (arc AddressResourceConfig) ValidEntity() error { //check if protocol set or port not 0 violations := validation.NewValidationError() if arc.Protocol != "" || arc.Port > 0 { //some setting, now lets make sure they are valid if err := validation.ValidPort(int(arc.Port)); err != nil { violations.Add(fmt.Errorf("error AddressResourceConfig: %v", err)) } if err := validation.StringIn(arc.Protocol, commons.TCP, commons.UDP); err != nil { violations.Add(fmt.Errorf("error AddressResourceConfig: invalid protocol: %v", err)) } } if violations.HasError() { return violations } return nil }