// filterNetworks filters network list according to user specified filter // and returns user chosen networks func filterNetworks(nws []types.NetworkResource, filter filters.Args) ([]types.NetworkResource, error) { // if filter is empty, return original network list if filter.Len() == 0 { return nws, nil } if err := filter.Validate(acceptedNetworkFilters); err != nil { return nil, err } displayNet := []types.NetworkResource{} for _, nw := range nws { if filter.Include("driver") { if !filter.ExactMatch("driver", nw.Driver) { continue } } if filter.Include("name") { if !filter.Match("name", nw.Name) { continue } } if filter.Include("id") { if !filter.Match("id", nw.ID) { continue } } if filter.Include("label") { if !filter.MatchKVList("label", nw.Labels) { continue } } displayNet = append(displayNet, nw) } if filter.Include("type") { var typeNet []types.NetworkResource errFilter := filter.WalkValues("type", func(fval string) error { passList, err := filterNetworkByType(displayNet, fval) if err != nil { return err } typeNet = append(typeNet, passList...) return nil }) if errFilter != nil { return nil, errFilter } displayNet = typeNet } return displayNet, nil }
// filterVolumes filters volume list according to user specified filter // and returns user chosen volumes func (daemon *Daemon) filterVolumes(vols []volume.Volume, filter filters.Args) ([]volume.Volume, error) { // if filter is empty, return original volume list if filter.Len() == 0 { return vols, nil } var retVols []volume.Volume for _, vol := range vols { if filter.Include("name") { if !filter.Match("name", vol.Name()) { continue } } if filter.Include("driver") { if !filter.Match("driver", vol.DriverName()) { continue } } if filter.Include("label") { v, ok := vol.(volume.LabeledVolume) if !ok { continue } if !filter.MatchKVList("label", v.Labels()) { continue } } retVols = append(retVols, vol) } danglingOnly := false if filter.Include("dangling") { if filter.ExactMatch("dangling", "true") || filter.ExactMatch("dangling", "1") { danglingOnly = true } else if !filter.ExactMatch("dangling", "false") && !filter.ExactMatch("dangling", "0") { return nil, fmt.Errorf("Invalid filter 'dangling=%s'", filter.Get("dangling")) } retVols = daemon.volumes.FilterByUsed(retVols, !danglingOnly) } return retVols, nil }