mirror of
https://github.com/containers/podman.git
synced 2025-06-23 10:38:20 +08:00
Merge pull request #8505 from Luap99/network-labels
podman network label support
This commit is contained in:
@ -50,7 +50,7 @@ func InspectNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
utils.NetworkNotFound(w, name, err)
|
||||
return
|
||||
}
|
||||
report, err := getNetworkResourceByName(name, runtime)
|
||||
report, err := getNetworkResourceByName(name, runtime, nil)
|
||||
if err != nil {
|
||||
utils.InternalServerError(w, err)
|
||||
return
|
||||
@ -58,7 +58,7 @@ func InspectNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
utils.WriteResponse(w, http.StatusOK, report)
|
||||
}
|
||||
|
||||
func getNetworkResourceByName(name string, runtime *libpod.Runtime) (*types.NetworkResource, error) {
|
||||
func getNetworkResourceByName(name string, runtime *libpod.Runtime, filters map[string][]string) (*types.NetworkResource, error) {
|
||||
var (
|
||||
ipamConfigs []dockerNetwork.IPAMConfig
|
||||
)
|
||||
@ -85,6 +85,16 @@ func getNetworkResourceByName(name string, runtime *libpod.Runtime) (*types.Netw
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(filters) > 0 {
|
||||
ok, err := network.IfPassesFilter(conf, filters)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !ok {
|
||||
// do not return the config if we did not match the filter
|
||||
return nil, nil
|
||||
}
|
||||
}
|
||||
|
||||
// No Bridge plugin means we bail
|
||||
bridge, err := genericPluginsToBridge(conf.Plugins, network.DefaultNetworkDriver)
|
||||
@ -129,14 +139,14 @@ func getNetworkResourceByName(name string, runtime *libpod.Runtime) (*types.Netw
|
||||
Options: nil,
|
||||
Config: ipamConfigs,
|
||||
},
|
||||
Internal: false,
|
||||
Internal: !bridge.IsGW,
|
||||
Attachable: false,
|
||||
Ingress: false,
|
||||
ConfigFrom: dockerNetwork.ConfigReference{},
|
||||
ConfigOnly: false,
|
||||
Containers: containerEndpoints,
|
||||
Options: nil,
|
||||
Labels: nil,
|
||||
Labels: network.GetNetworkLabels(conf),
|
||||
Peers: nil,
|
||||
Services: nil,
|
||||
}
|
||||
@ -180,41 +190,23 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
filterNames, nameFilterExists := query.Filters["name"]
|
||||
// TODO remove when filters are 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))
|
||||
var reports []*types.NetworkResource
|
||||
logrus.Errorf("netNames: %q", strings.Join(netNames, ", "))
|
||||
for _, name := range netNames {
|
||||
report, err := getNetworkResourceByName(name, runtime)
|
||||
report, err := getNetworkResourceByName(name, runtime, query.Filters)
|
||||
if err != nil {
|
||||
utils.InternalServerError(w, err)
|
||||
return
|
||||
}
|
||||
reports = append(reports, report)
|
||||
if report != nil {
|
||||
reports = append(reports, report)
|
||||
}
|
||||
}
|
||||
utils.WriteResponse(w, http.StatusOK, reports)
|
||||
}
|
||||
@ -245,6 +237,7 @@ func CreateNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
ncOptions := entities.NetworkCreateOptions{
|
||||
Driver: network.DefaultNetworkDriver,
|
||||
Internal: networkCreate.Internal,
|
||||
Labels: networkCreate.Labels,
|
||||
}
|
||||
if networkCreate.IPAM != nil && networkCreate.IPAM.Config != nil {
|
||||
if len(networkCreate.IPAM.Config) > 1 {
|
||||
|
@ -48,7 +48,7 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
|
||||
runtime := r.Context().Value("runtime").(*libpod.Runtime)
|
||||
decoder := r.Context().Value("decoder").(*schema.Decoder)
|
||||
query := struct {
|
||||
Filter string `schema:"filter"`
|
||||
Filters map[string][]string `schema:"filters"`
|
||||
}{
|
||||
// override any golang type defaults
|
||||
}
|
||||
@ -59,7 +59,7 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
options := entities.NetworkListOptions{
|
||||
Filter: query.Filter,
|
||||
Filters: query.Filters,
|
||||
}
|
||||
ic := abi.ContainerEngine{Libpod: runtime}
|
||||
reports, err := ic.NetworkList(r.Context(), options)
|
||||
|
@ -65,7 +65,11 @@ func (s *APIServer) registerNetworkHandlers(r *mux.Router) error {
|
||||
// - 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.
|
||||
// description: |
|
||||
// JSON encoded value of the filters (a map[string][]string) to process on the network list. Currently available filters:
|
||||
// - name=[name] Matches network name (accepts regex).
|
||||
// - driver=[driver] Only bridge is supported.
|
||||
// - label=[key] or label=[key=value] Matches networks based on the presence of a label alone or a label and a value.
|
||||
// produces:
|
||||
// - application/json
|
||||
// responses:
|
||||
@ -216,9 +220,14 @@ func (s *APIServer) registerNetworkHandlers(r *mux.Router) error {
|
||||
// description: Display summary of network configurations
|
||||
// parameters:
|
||||
// - in: query
|
||||
// name: filter
|
||||
// name: filters
|
||||
// type: string
|
||||
// description: Provide filter values (e.g. 'name=podman')
|
||||
// description: |
|
||||
// JSON encoded value of the filters (a map[string][]string) to process on the network list. Available filters:
|
||||
// - name=[name] Matches network name (accepts regex).
|
||||
// - driver=[driver] Only bridge is supported.
|
||||
// - label=[key] or label=[key=value] Matches networks based on the presence of a label alone or a label and a value.
|
||||
// - plugin=[plugin] Matches CNI plugins included in a network (e.g `bridge`,`portmap`,`firewall`,`tuning`,`dnsname`,`macvlan`)
|
||||
// produces:
|
||||
// - application/json
|
||||
// responses:
|
||||
|
Reference in New Issue
Block a user