Skip to content

Commit

Permalink
Merge pull request #7536 from Luap99/api-network-filter
Browse files Browse the repository at this point in the history
APIv2 Add network list filtering
  • Loading branch information
openshift-merge-robot authored Sep 10, 2020
2 parents e1b4729 + ce7d2bb commit 3d33923
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 9 deletions.
22 changes: 20 additions & 2 deletions pkg/api/handlers/compat/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"net"
"net/http"
"os"
"strings"
"syscall"
"time"

Expand Down Expand Up @@ -177,16 +178,33 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
utils.InternalServerError(w, err)
return
}

filterNames, nameFilterExists := query.Filters["name"]
// TODO remove when filters are implemented
if len(query.Filters) > 0 {
utils.InternalServerError(w, errors.New("filters for listing networks is not implemented"))
if (!nameFilterExists && len(query.Filters) > 0) || len(query.Filters) > 1 {
utils.InternalServerError(w, errors.New("only the name filter for listing networks is implemented"))
return
}
netNames, err := network.GetNetworkNamesFromFileSystem(config)
if err != nil {
utils.InternalServerError(w, err)
return
}

// filter by name
if nameFilterExists {
names := []string{}
for _, name := range netNames {
for _, filter := range filterNames {
if strings.Contains(name, filter) {
names = append(names, name)
break
}
}
}
netNames = names
}

reports := make([]*types.NetworkResource, 0, len(netNames))
for _, name := range netNames {
report, err := getNetworkResourceByName(name, runtime)
Expand Down
16 changes: 15 additions & 1 deletion pkg/api/handlers/libpod/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,21 @@ func CreateNetwork(w http.ResponseWriter, r *http.Request) {
}
func ListNetworks(w http.ResponseWriter, r *http.Request) {
runtime := r.Context().Value("runtime").(*libpod.Runtime)
options := entities.NetworkListOptions{}
decoder := r.Context().Value("decoder").(*schema.Decoder)
query := struct {
Filter string `schema:"filter"`
}{
// override any golang type defaults
}
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
errors.Wrapf(err, "Failed to parse parameters for %s", r.URL.String()))
return
}

options := entities.NetworkListOptions{
Filter: query.Filter,
}
ic := abi.ContainerEngine{Libpod: runtime}
reports, err := ic.NetworkList(r.Context(), options)
if err != nil {
Expand Down
12 changes: 11 additions & 1 deletion pkg/api/server/register_networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ func (s *APIServer) registerNetworkHandlers(r *mux.Router) error {
// - networks (compat)
// summary: List networks
// description: Display summary of network configurations
// parameters:
// - in: query
// name: filters
// type: string
// description: JSON encoded value of the filters (a map[string][]string) to process on the networks list. Only the name filter is supported.
// produces:
// - application/json
// responses:
Expand Down Expand Up @@ -106,7 +111,7 @@ func (s *APIServer) registerNetworkHandlers(r *mux.Router) error {
// required: true
// description: the name of the network
// - in: query
// name: Force
// name: force
// type: boolean
// description: remove containers associated with network
// produces:
Expand Down Expand Up @@ -152,6 +157,11 @@ func (s *APIServer) registerNetworkHandlers(r *mux.Router) error {
// - networks
// summary: List networks
// description: Display summary of network configurations
// parameters:
// - in: query
// name: filter
// type: string
// description: Provide filter values (e.g. 'name=podman')
// produces:
// - application/json
// responses:
Expand Down
8 changes: 6 additions & 2 deletions pkg/bindings/network/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,19 @@ func Remove(ctx context.Context, nameOrID string, force *bool) ([]*entities.Netw
}

// List returns a summary of all CNI network configurations
func List(ctx context.Context) ([]*entities.NetworkListReport, error) {
func List(ctx context.Context, options entities.NetworkListOptions) ([]*entities.NetworkListReport, error) {
var (
netList []*entities.NetworkListReport
)
conn, err := bindings.GetClient(ctx)
if err != nil {
return nil, err
}
response, err := conn.DoRequest(nil, http.MethodGet, "/networks/json", nil, nil)
params := url.Values{}
if options.Filter != "" {
params.Set("filter", options.Filter)
}
response, err := conn.DoRequest(nil, http.MethodGet, "/networks/json", params, nil)
if err != nil {
return netList, err
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/domain/infra/tunnel/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
)

func (ic *ContainerEngine) NetworkList(ctx context.Context, options entities.NetworkListOptions) ([]*entities.NetworkListReport, error) {
return network.List(ic.ClientCxt)
return network.List(ic.ClientCxt, options)
}

func (ic *ContainerEngine) NetworkInspect(ctx context.Context, namesOrIds []string, options entities.NetworkInspectOptions) ([]entities.NetworkInspectReport, error) {
Expand Down
21 changes: 21 additions & 0 deletions test/apiv2/35-networks.at
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,27 @@ if root; then
t POST libpod/networks/create '"Subnet":{"IP":"10.10.1.0","Mask":[0,255,255,0]}' 500 \
.cause~'.*mask is invalid'

# network list
t GET libpod/networks/json 200
t GET libpod/networks/json?filter=name=network1 200 \
length=1 \
.[0].Name=network1
t GET networks 200

#network list docker endpoint
#filters={"name":["network1","network2"]}
t GET networks?filters=%7B%22name%22%3A%5B%22network1%22%2C%22network2%22%5D%7D 200 \
length=2
#filters={"name":["network"]}
t GET networks?filters=%7B%22name%22%3A%5B%22network%22%5D%7D 200 \
length=2
# invalid filter filters={"label":"abc"}
t GET networks?filters=%7B%22label%22%3A%5B%22abc%22%5D%7D 500 \
.cause="only the name filter for listing networks is implemented"
# invalid filter filters={"label":"abc","name":["network"]}
t GET networks?filters=%7B%22label%22%3A%22abc%22%2C%22name%22%3A%5B%22network%22%5D%7D 500 \
.cause="only the name filter for listing networks is implemented"

# clean the network
t DELETE libpod/networks/network1 200 \
.[0].Name~network1 \
Expand Down
2 changes: 0 additions & 2 deletions test/e2e/network_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// +build !remote

package integration

import (
Expand Down

0 comments on commit 3d33923

Please sign in to comment.