func serviceDelete(w http.ResponseWriter, r *http.Request, t auth.Token) error { s, err := getService(r.URL.Query().Get(":name")) if err != nil { return err } allowed := permission.Check(t, permission.PermServiceDelete, append(permission.Contexts(permission.CtxTeam, s.OwnerTeams), permission.Context(permission.CtxService, s.Name), )..., ) if !allowed { return permission.ErrUnauthorized } rec.Log(t.GetUserName(), "delete-service", r.URL.Query().Get(":name")) instances, err := service.GetServiceInstancesByServices([]service.Service{s}) if err != nil { return err } if len(instances) > 0 { msg := "This service cannot be removed because it has instances.\nPlease remove these instances before removing the service." return &errors.HTTP{Code: http.StatusForbidden, Message: msg} } err = s.Delete() if err != nil { return err } w.WriteHeader(http.StatusNoContent) return nil }
// title: service delete // path: /services/{name} // method: DELETE // responses: // 200: Service removed // 401: Unauthorized // 403: Forbidden (team is not the owner or service with instances) // 404: Service not found func serviceDelete(w http.ResponseWriter, r *http.Request, t auth.Token) (err error) { r.ParseForm() s, err := getService(r.URL.Query().Get(":name")) if err != nil { return err } allowed := permission.Check(t, permission.PermServiceDelete, contextsForServiceProvision(&s)..., ) if !allowed { return permission.ErrUnauthorized } evt, err := event.New(&event.Opts{ Target: serviceTarget(s.Name), Kind: permission.PermServiceDelete, Owner: t, CustomData: event.FormToCustomData(r.Form), Allowed: event.Allowed(permission.PermServiceReadEvents, contextsForServiceProvision(&s)...), }) if err != nil { return err } defer func() { evt.Done(err) }() instances, err := service.GetServiceInstancesByServices([]service.Service{s}) if err != nil { return err } if len(instances) > 0 { msg := "This service cannot be removed because it has instances.\n" msg += "Please remove these instances before removing the service." return &errors.HTTP{Code: http.StatusForbidden, Message: msg} } return s.Delete() }
// title: service list // path: /services // method: GET // produce: application/json // responses: // 200: List services // 204: No content // 401: Unauthorized func serviceList(w http.ResponseWriter, r *http.Request, t auth.Token) error { contexts := permission.ContextsForPermission(t, permission.PermServiceRead) services, err := provisionReadableServices(t, contexts) if err != nil { return err } sInstances, err := service.GetServiceInstancesByServices(services) if err != nil { return err } results := make([]service.ServiceModel, len(services)) for i, s := range services { results[i].Service = s.Name for _, si := range sInstances { if si.ServiceName == s.Name { results[i].Instances = append(results[i].Instances, si.Name) } } } if len(results) == 0 { w.WriteHeader(http.StatusNoContent) return nil } w.Header().Set("Content-Type", "application/json") return json.NewEncoder(w).Encode(results) }
func servicesAndInstancesByOwner(u *auth.User) []service.ServiceModel { services, _ := service.GetServicesByOwnerTeams("owner_teams", u) sInstances, _ := service.GetServiceInstancesByServices(services) results := make([]service.ServiceModel, len(services)) for i, s := range services { results[i].Service = s.Name for _, si := range sInstances { if si.ServiceName == s.Name { results[i].Instances = append(results[i].Instances, si.Name) } } } return results }
// title: service list // path: /services // method: GET // produce: application/json // responses: // 200: List services // 204: No content // 401: Unauthorized func serviceList(w http.ResponseWriter, r *http.Request, t auth.Token) error { rec.Log(t.GetUserName(), "list-services") teams := []string{} serviceNames := []string{} contexts := permission.ContextsForPermission(t, permission.PermServiceRead) for _, c := range contexts { if c.CtxType == permission.CtxGlobal { teams = nil serviceNames = nil break } switch c.CtxType { case permission.CtxService: serviceNames = append(serviceNames, c.Value) case permission.CtxTeam: teams = append(teams, c.Value) } } services, err := service.GetServicesByOwnerTeamsAndServices(teams, serviceNames) if err != nil { return err } sInstances, err := service.GetServiceInstancesByServices(services) if err != nil { return err } results := make([]service.ServiceModel, len(services)) for i, s := range services { results[i].Service = s.Name for _, si := range sInstances { if si.ServiceName == s.Name { results[i].Instances = append(results[i].Instances, si.Name) } } } if len(results) == 0 { w.WriteHeader(http.StatusNoContent) return nil } b, err := json.Marshal(results) if err != nil { return &errors.HTTP{Code: http.StatusInternalServerError, Message: err.Error()} } n, err := w.Write(b) if n != len(b) { return &errors.HTTP{Code: http.StatusInternalServerError, Message: "Failed to write response body"} } w.Header().Set("Content-Type", "application/json") return err }