//ValidEntity used to make sure AddressAssignment is in a valid state func (a *AddressAssignment) ValidEntity() error { v := validation.NewValidationError() v.Add(validation.NotEmpty("ServiceID", a.ServiceID)) v.Add(validation.NotEmpty("EndpointName", a.EndpointName)) v.Add(validation.IsIP(a.IPAddr)) v.Add(validation.ValidPort(int(a.Port))) switch a.AssignmentType { case commons.STATIC: { v.Add(validation.NotEmpty("HostID", a.HostID)) } case commons.VIRTUAL: { v.Add(validation.NotEmpty("PoolID", a.PoolID)) } default: return fmt.Errorf("assignment type must be static of virtual, found %v", a.AssignmentType) } if v.HasError() { return v } return nil }
//ValidEntity validates Host fields func (h *Host) ValidEntity() error { glog.V(4).Info("Validating host") //if err := validation.ValidHostID(entity.ID); err != nil { // return fmt.Errorf("invalid hostid:'%s' for host Name:'%s' IP:%s", entity.ID, entity.Name, entity.IPAddr) //} trimmedID := strings.TrimSpace(h.ID) violations := validation.NewValidationError() violations.Add(validation.NotEmpty("Host.ID", h.ID)) violations.Add(validation.ValidHostID(h.ID)) violations.Add(validation.StringsEqual(h.ID, trimmedID, "leading and trailing spaces not allowed for host id")) violations.Add(validation.ValidPort(h.RPCPort)) violations.Add(validation.NotEmpty("Host.PoolID", h.PoolID)) violations.Add(validation.IsIP(h.IPAddr)) //TODO: what should we be validating here? It doesn't seem to work for glog.V(4).Infof("Validating IPAddr %v for host %s", h.IPAddr, h.ID) ipAddr, err := net.ResolveIPAddr("ip4", h.IPAddr) if err != nil { glog.Errorf("Could not resolve: %s to an ip4 address: %v", h.IPAddr, err) violations.Add(err) } else if ipAddr.IP.IsLoopback() { glog.Errorf("Can not use %s as host address because it is a loopback address", h.IPAddr) violations.Add(errors.New("host ip can not be a loopback address")) } if len(violations.Errors) > 0 { return violations } return nil }
//ValidEntity used to make sure ServiceEndpoint is in a valid state func (se EndpointDefinition) ValidEntity() error { trimName := strings.Trim(se.Name, " ") if trimName == "" { return fmt.Errorf("service definition %v: endpoint must have a name %v", se.Name, se) } if se.Purpose != "import" { if err := validation.ValidPort(int(se.PortNumber)); err != nil { return fmt.Errorf("endpoint '%s': %s", se.Name, err) } if err := applicationValidation(se.Application); err != nil { return fmt.Errorf("endpoint '%s': %s", se.Name, err) } } return se.AddressConfig.ValidEntity() }
//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 }