//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 }