// title: event list // path: /events // method: GET // produce: application/json // responses: // 200: OK // 204: No content func eventList(w http.ResponseWriter, r *http.Request, t auth.Token) error { r.ParseForm() filter := &event.Filter{} dec := form.NewDecoder(nil) dec.IgnoreUnknownKeys(true) dec.IgnoreCase(true) err := dec.DecodeValues(&filter, r.Form) if err != nil { return &errors.HTTP{Code: http.StatusBadRequest, Message: fmt.Sprintf("unable to parse event filters: %s", err)} } filter.PruneUserValues() filter.Permissions, err = t.Permissions() if err != nil { return err } events, err := event.List(filter) if err != nil { return err } if len(events) == 0 { w.WriteHeader(http.StatusNoContent) return nil } w.Header().Add("Content-Type", "application/json") return json.NewEncoder(w).Encode(events) }
// ListDeploys returns the list of deploy that match a given filter. func ListDeploys(filter *Filter, skip, limit int) ([]DeployData, error) { conn, err := db.Conn() if err != nil { return nil, err } defer conn.Close() appsList, err := List(filter) if err != nil { return nil, err } apps := make([]string, len(appsList)) for i, a := range appsList { apps[i] = a.GetName() } evts, err := event.List(&event.Filter{ Target: event.Target{Type: event.TargetTypeApp}, Raw: bson.M{"target.value": bson.M{"$in": apps}}, KindName: permission.PermAppDeploy.FullName(), KindType: event.KindTypePermission, Limit: limit, Skip: skip, }) if err != nil { return nil, err } validImages, err := findValidImages(appsList...) if err != nil { return nil, err } list := make([]DeployData, len(evts)) for i := range evts { list[i] = *eventToDeployData(&evts[i], validImages, false) } return list, nil }
func listAutoScaleEvents(skip, limit int) ([]autoScaleEvent, error) { evts, err := event.List(&event.Filter{ Skip: skip, Limit: limit, KindName: autoScaleEventKind, }) if err != nil { return nil, err } asEvts := make([]autoScaleEvent, len(evts)) for i := range evts { asEvts[i], err = toAutoScaleEvent(&evts[i]) if err != nil { return nil, err } } return asEvts, nil }
func ListHealingHistory(filter string) ([]HealingEvent, error) { evtFilter := event.Filter{ KindName: "healer", KindType: event.KindTypeInternal, } if filter != "" { t, err := event.GetTargetType(filter) if err == nil { evtFilter.Target = event.Target{Type: t} } } evts, err := event.List(&evtFilter) if err != nil { return nil, err } healingEvts := make([]HealingEvent, len(evts)) for i := range evts { healingEvts[i], err = toHealingEvt(&evts[i]) if err != nil { return nil, err } } return healingEvts, nil }
func (s *S) TestListFilterMany(c *check.C) { var allEvts []event.Event var create = func(opts *event.Opts) { evt, err := event.New(opts) c.Assert(err, check.IsNil) allEvts = append(allEvts, *evt) } var createi = func(opts *event.Opts) { evt, err := event.NewInternal(opts) c.Assert(err, check.IsNil) allEvts = append(allEvts, *evt) } var checkFilters = func(f *event.Filter, expected interface{}) { evts, err := event.List(f) c.Assert(err, check.IsNil) c.Assert(evts, eventtest.EvtEquals, expected) } create(&event.Opts{ Target: event.Target{Type: "app", Value: "myapp"}, Kind: permission.PermAppUpdateEnvSet, Owner: s.token, Allowed: event.Allowed(permission.PermAppReadEvents, permission.Context(permission.CtxApp, "myapp")), }) time.Sleep(100 * time.Millisecond) t0 := time.Now().UTC() create(&event.Opts{ Target: event.Target{Type: "app", Value: "myapp2"}, Kind: permission.PermAppUpdateEnvSet, Owner: s.token, Allowed: event.Allowed(permission.PermAppAdmin), }) t05 := time.Now().UTC() time.Sleep(100 * time.Millisecond) create(&event.Opts{ Target: event.Target{Type: "app2", Value: "myapp"}, Kind: permission.PermAppUpdateEnvSet, Owner: s.token, Allowed: event.Allowed(permission.PermAppAdmin), }) t1 := time.Now().UTC() time.Sleep(100 * time.Millisecond) createi(&event.Opts{ Target: event.Target{Type: "node", Value: "http://10.0.1.1"}, InternalKind: "healer", Allowed: event.Allowed(permission.PermAppAdmin), }) createi(&event.Opts{ Target: event.Target{Type: "node", Value: "http://10.0.1.2"}, InternalKind: "healer", Allowed: event.Allowed(permission.PermAppAdmin), }) createi(&event.Opts{ Target: event.Target{Type: "nodex", Value: "http://10.0.1.3"}, InternalKind: "healer", Allowed: event.Allowed(permission.PermAppAdmin), }) err := event.MarkAsRemoved(event.Target{Type: "nodex", Value: "http://10.0.1.3"}) c.Assert(err, check.IsNil) allEvts[len(allEvts)-2].Done(nil) allEvts[len(allEvts)-3].Done(errors.New("my err")) checkFilters(&event.Filter{Sort: "_id"}, allEvts[:len(allEvts)-1]) checkFilters(&event.Filter{Running: boolPtr(false), Sort: "_id"}, allEvts[len(allEvts)-3:len(allEvts)-1]) checkFilters(&event.Filter{Running: boolPtr(true), Sort: "_id"}, allEvts[:len(allEvts)-3]) checkFilters(&event.Filter{ErrorOnly: true, Sort: "_id"}, allEvts[len(allEvts)-3]) checkFilters(&event.Filter{Target: event.Target{Type: "app"}, Sort: "_id"}, []event.Event{allEvts[0], allEvts[1]}) checkFilters(&event.Filter{Target: event.Target{Type: "app", Value: "myapp"}}, allEvts[0]) checkFilters(&event.Filter{KindType: event.KindTypeInternal, Sort: "_id"}, allEvts[3:len(allEvts)-1]) checkFilters(&event.Filter{KindType: event.KindTypePermission, Sort: "_id"}, allEvts[:3]) checkFilters(&event.Filter{KindType: event.KindTypePermission, KindName: "kind"}, nil) checkFilters(&event.Filter{KindType: event.KindTypeInternal, KindName: "healer", Sort: "_id"}, allEvts[3:len(allEvts)-1]) checkFilters(&event.Filter{OwnerType: event.OwnerTypeUser, Sort: "_id"}, allEvts[:3]) checkFilters(&event.Filter{OwnerType: event.OwnerTypeInternal, Sort: "_id"}, allEvts[3:len(allEvts)-1]) checkFilters(&event.Filter{OwnerType: event.OwnerTypeUser, OwnerName: s.token.GetUserName(), Sort: "_id"}, allEvts[:3]) checkFilters(&event.Filter{Since: t0, Sort: "_id"}, allEvts[1:len(allEvts)-1]) checkFilters(&event.Filter{Until: t05, Sort: "_id"}, allEvts[:2]) checkFilters(&event.Filter{Since: t0, Until: t1, Sort: "_id"}, allEvts[1:3]) checkFilters(&event.Filter{Limit: 2, Sort: "_id"}, allEvts[:2]) checkFilters(&event.Filter{Limit: 1, Sort: "-_id"}, allEvts[len(allEvts)-2]) checkFilters(&event.Filter{Target: event.Target{Type: "nodex"}}, allEvts[:0]) checkFilters(&event.Filter{Target: event.Target{Type: "nodex"}, IncludeRemoved: true}, allEvts[5:6]) checkFilters(&event.Filter{AllowedTargets: []event.TargetFilter{}, Sort: "_id"}, allEvts[:0]) checkFilters(&event.Filter{AllowedTargets: []event.TargetFilter{ {Type: "app"}, }, Sort: "_id"}, allEvts[:2]) checkFilters(&event.Filter{AllowedTargets: []event.TargetFilter{ {Type: "app", Values: []string{}}, }, Sort: "_id"}, allEvts[:0]) checkFilters(&event.Filter{AllowedTargets: []event.TargetFilter{ {Type: "app", Values: []string{"myapp", "myapp2"}}, }, Sort: "_id"}, allEvts[:2]) checkFilters(&event.Filter{AllowedTargets: []event.TargetFilter{ {Type: "app", Values: []string{"myapp"}}, {Type: "node", Values: []string{"http://10.0.1.2"}}, }, Sort: "_id"}, []event.Event{allEvts[0], allEvts[4]}) checkFilters(&event.Filter{Permissions: []permission.Permission{ {Scheme: permission.PermAll, Context: permission.Context(permission.CtxGlobal, "")}, }, Sort: "_id"}, allEvts[:len(allEvts)-1]) checkFilters(&event.Filter{Permissions: []permission.Permission{ {Scheme: permission.PermAll}, }, Sort: "_id"}, allEvts[:0]) checkFilters(&event.Filter{Permissions: []permission.Permission{ {Scheme: permission.PermAppRead, Context: permission.Context(permission.CtxApp, "myapp")}, {Scheme: permission.PermAppRead, Context: permission.Context(permission.CtxApp, "invalid-app")}, }, Sort: "_id"}, allEvts[:1]) checkFilters(&event.Filter{Permissions: []permission.Permission{ {Scheme: permission.PermAppRead, Context: permission.Context(permission.CtxApp, "invalid-app")}, }, Sort: "_id"}, allEvts[:0]) }