@@ -299,11 +299,9 @@ func (controller *Controller) listVMs(ctx *gin.Context) responder.Responder {
299299 return responder
300300 }
301301
302- var opts []storepkg. ListOption
302+ var filters []v1. Filter
303303
304304 if filterRaw := ctx .Query ("filter" ); filterRaw != "" {
305- var filters []v1.Filter
306-
307305 for _ , filterRaw := range strings .Split (filterRaw , "," ) {
308306 filter , err := v1 .NewFilter (filterRaw )
309307 if err != nil {
@@ -312,23 +310,53 @@ func (controller *Controller) listVMs(ctx *gin.Context) responder.Responder {
312310
313311 filters = append (filters , filter )
314312 }
313+ }
315314
316- if len (filters ) > 1 {
317- return responder .JSON (http .StatusPreconditionFailed , NewErrorResponse ("only " +
318- "a single filter is currently supported" ))
319- }
315+ resultCh := controller .single .DoChan ("list-vms" , func () (interface {}, error ) {
316+ var vms []v1.VM
317+
318+ viewErr := controller .store .View (func (txn storepkg.Transaction ) (err error ) {
319+ vms , err = txn .ListVMs ()
320+ return
321+ })
322+
323+ return vms , viewErr
324+ })
320325
321- opts = append (opts , storepkg .WithListFilters (filters ... ))
326+ var computedVMs interface {}
327+ var err error
328+
329+ select {
330+ case <- ctx .Done ():
331+ return responder .Empty ()
332+ case result := <- resultCh :
333+ computedVMs = result .Val
334+ err = result .Err
322335 }
323336
324- return controller .storeView (func (txn storepkg.Transaction ) responder.Responder {
325- vms , err := txn .ListVMs (opts ... )
326- if err != nil {
327- return responder .Error (err )
337+ if err != nil {
338+ return responder .Error (err )
339+ }
340+
341+ allVMs , ok := computedVMs .([]v1.VM )
342+ if ! ok {
343+ controller .logger .Errorf ("failed to compute vms: %T" , computedVMs )
344+ return responder .Code (http .StatusInternalServerError )
345+ }
346+
347+ vms := make ([]v1.VM , 0 , len (allVMs ))
348+
349+ Outer:
350+ for _ , vm := range allVMs {
351+ for _ , filter := range filters {
352+ if ! vm .Match (filter ) {
353+ continue Outer
354+ }
328355 }
356+ vms = append (vms , vm )
357+ }
329358
330- return responder .JSON (http .StatusOK , vms )
331- })
359+ return responder .JSON (http .StatusOK , vms )
332360}
333361
334362func (controller * Controller ) deleteVM (ctx * gin.Context ) responder.Responder {
0 commit comments