func validateObject(obj interface{}) (errors []error) { switch t := obj.(type) { case *api.ReplicationController: errors = api.ValidateManifest(&t.DesiredState.PodTemplate.DesiredState.Manifest) case *api.ReplicationControllerList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) } case *api.Service: errors = api.ValidateService(t) case *api.ServiceList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) } case *api.Pod: errors = api.ValidateManifest(&t.DesiredState.Manifest) case *api.PodList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) } default: return []error{fmt.Errorf("no validation defined for %#v", obj)} } return errors }
func (rs *RegistryStorage) Update(obj interface{}) (<-chan interface{}, error) { srv := obj.(*api.Service) if errs := api.ValidateService(srv); len(errs) > 0 { return nil, apiserver.NewInvalidErr("service", srv.ID, errs) } return apiserver.MakeAsync(func() (interface{}, error) { // TODO: check to see if external load balancer status changed err := rs.registry.UpdateService(*srv) if err != nil { return nil, err } return rs.registry.GetService(srv.ID) }), nil }
func (rs *RegistryStorage) Update(obj interface{}) (<-chan interface{}, error) { srv := obj.(*api.Service) if srv.ID == "" { return nil, fmt.Errorf("ID should not be empty: %#v", srv) } if errs := api.ValidateService(srv); len(errs) > 0 { return nil, fmt.Errorf("Validation errors: %v", errs) } return apiserver.MakeAsync(func() (interface{}, error) { // TODO: check to see if external load balancer status changed err := rs.registry.UpdateService(*srv) if err != nil { return nil, err } return rs.registry.GetService(srv.ID) }), nil }
func (rs *RegistryStorage) Create(obj interface{}) (<-chan interface{}, error) { srv := obj.(*api.Service) if errs := api.ValidateService(srv); len(errs) > 0 { return nil, fmt.Errorf("Validation errors: %v", errs) } srv.CreationTimestamp = util.Now() return apiserver.MakeAsync(func() (interface{}, error) { // TODO: Consider moving this to a rectification loop, so that we make/remove external load balancers // correctly no matter what http operations happen. if srv.CreateExternalLoadBalancer { if rs.cloud == nil { return nil, fmt.Errorf("requested an external service, but no cloud provider supplied.") } balancer, ok := rs.cloud.TCPLoadBalancer() if !ok { return nil, fmt.Errorf("The cloud provider does not support external TCP load balancers.") } zones, ok := rs.cloud.Zones() if !ok { return nil, fmt.Errorf("The cloud provider does not support zone enumeration.") } hosts, err := rs.machines.List() if err != nil { return nil, err } zone, err := zones.GetZone() if err != nil { return nil, err } err = balancer.CreateTCPLoadBalancer(srv.ID, zone.Region, srv.Port, hosts) if err != nil { return nil, err } } err := rs.registry.CreateService(*srv) if err != nil { return nil, err } return rs.registry.GetService(srv.ID) }), nil }
func (sr *ServiceRegistryStorage) Create(obj interface{}) (<-chan interface{}, error) { srv := obj.(api.Service) if errs := api.ValidateService(&srv); len(errs) > 0 { return nil, fmt.Errorf("Validation errors: %v", errs) } return apiserver.MakeAsync(func() (interface{}, error) { // TODO: Consider moving this to a rectification loop, so that we make/remove external load balancers // correctly no matter what http operations happen. if srv.CreateExternalLoadBalancer { var balancer cloudprovider.TCPLoadBalancer var zones cloudprovider.Zones var ok bool if sr.cloud != nil { balancer, ok = sr.cloud.TCPLoadBalancer() if ok { zones, ok = sr.cloud.Zones() } } if ok && balancer != nil && zones != nil { hosts, err := sr.machines.List() if err != nil { return nil, err } zone, err := zones.GetZone() if err != nil { return nil, err } err = balancer.CreateTCPLoadBalancer(srv.ID, zone, srv.Port, hosts) if err != nil { return nil, err } } else { return nil, fmt.Errorf("requested an external service, but no cloud provider supplied.") } } // TODO actually wait for the object to be fully created here. err := sr.registry.CreateService(srv) if err != nil { return nil, err } return sr.registry.GetService(srv.ID) }), nil }