compat api: allow default bridge name for networks

Docker uses "bridge" as default network name so some tools expect this
to work with network list or inspect. To fix this we change "bridge" to
the podman default ("podman") name.

Fixes #14983

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
Paul Holzinger
2022-07-21 13:42:21 +02:00
parent 712267ee20
commit 80ad0cfd05
2 changed files with 34 additions and 11 deletions

View File

@ -23,6 +23,13 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
func normalizeNetworkName(rt *libpod.Runtime, name string) (string, bool) {
if name == nettypes.BridgeNetworkDriver {
return rt.Network().DefaultNetworkName(), true
}
return name, false
}
func InspectNetwork(w http.ResponseWriter, r *http.Request) { func InspectNetwork(w http.ResponseWriter, r *http.Request) {
runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime)
@ -44,13 +51,13 @@ func InspectNetwork(w http.ResponseWriter, r *http.Request) {
utils.Error(w, http.StatusBadRequest, define.ErrInvalidArg) utils.Error(w, http.StatusBadRequest, define.ErrInvalidArg)
return return
} }
name := utils.GetName(r) name, changed := normalizeNetworkName(runtime, utils.GetName(r))
net, err := runtime.Network().NetworkInspect(name) net, err := runtime.Network().NetworkInspect(name)
if err != nil { if err != nil {
utils.NetworkNotFound(w, name, err) utils.NetworkNotFound(w, name, err)
return return
} }
report, err := convertLibpodNetworktoDockerNetwork(runtime, net) report, err := convertLibpodNetworktoDockerNetwork(runtime, &net, changed)
if err != nil { if err != nil {
utils.InternalServerError(w, err) utils.InternalServerError(w, err)
return return
@ -58,7 +65,7 @@ func InspectNetwork(w http.ResponseWriter, r *http.Request) {
utils.WriteResponse(w, http.StatusOK, report) utils.WriteResponse(w, http.StatusOK, report)
} }
func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, network nettypes.Network) (*types.NetworkResource, error) { func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, network *nettypes.Network, changeDefaultName bool) (*types.NetworkResource, error) {
cons, err := runtime.GetAllContainers() cons, err := runtime.GetAllContainers()
if err != nil { if err != nil {
return nil, err return nil, err
@ -107,11 +114,15 @@ func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, network nettyp
Config: ipamConfigs, Config: ipamConfigs,
} }
name := network.Name
if changeDefaultName && name == runtime.Network().DefaultNetworkName() {
name = nettypes.BridgeNetworkDriver
}
report := types.NetworkResource{ report := types.NetworkResource{
Name: network.Name, Name: name,
ID: network.ID, ID: network.ID,
Driver: network.Driver, Driver: network.Driver,
// TODO add Created: , Created: network.Created,
Internal: network.Internal, Internal: network.Internal,
EnableIPv6: network.IPv6Enabled, EnableIPv6: network.IPv6Enabled,
Labels: network.Labels, Labels: network.Labels,
@ -149,7 +160,7 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
} }
reports := make([]*types.NetworkResource, 0, len(nets)) reports := make([]*types.NetworkResource, 0, len(nets))
for _, net := range nets { for _, net := range nets {
report, err := convertLibpodNetworktoDockerNetwork(runtime, net) report, err := convertLibpodNetworktoDockerNetwork(runtime, &net, true)
if err != nil { if err != nil {
utils.InternalServerError(w, err) utils.InternalServerError(w, err)
return return
@ -305,7 +316,7 @@ func RemoveNetwork(w http.ResponseWriter, r *http.Request) {
Timeout: query.Timeout, Timeout: query.Timeout,
} }
name := utils.GetName(r) name, _ := normalizeNetworkName(runtime, utils.GetName(r))
reports, err := ic.NetworkRm(r.Context(), []string{name}, options) reports, err := ic.NetworkRm(r.Context(), []string{name}, options)
if err != nil { if err != nil {
utils.Error(w, http.StatusInternalServerError, err) utils.Error(w, http.StatusInternalServerError, err)
@ -340,7 +351,7 @@ func Connect(w http.ResponseWriter, r *http.Request) {
netOpts := nettypes.PerNetworkOptions{} netOpts := nettypes.PerNetworkOptions{}
name := utils.GetName(r) name, _ := normalizeNetworkName(runtime, utils.GetName(r))
if netConnect.EndpointConfig != nil { if netConnect.EndpointConfig != nil {
if netConnect.EndpointConfig.Aliases != nil { if netConnect.EndpointConfig.Aliases != nil {
netOpts.Aliases = netConnect.EndpointConfig.Aliases netOpts.Aliases = netConnect.EndpointConfig.Aliases
@ -416,7 +427,7 @@ func Disconnect(w http.ResponseWriter, r *http.Request) {
return return
} }
name := utils.GetName(r) name, _ := normalizeNetworkName(runtime, utils.GetName(r))
err := runtime.DisconnectContainerFromNetwork(netDisconnect.Container, name, netDisconnect.Force) err := runtime.DisconnectContainerFromNetwork(netDisconnect.Container, name, netDisconnect.Force)
if err != nil { if err != nil {
if errors.Is(err, define.ErrNoSuchCtr) { if errors.Is(err, define.ErrNoSuchCtr) {

View File

@ -84,12 +84,24 @@ t GET networks?filters='{"dangling":["true","0"]}' 500 \
t GET networks?filters='{"name":["doesnotexists"]}' 200 \ t GET networks?filters='{"name":["doesnotexists"]}' 200 \
"[]" "[]"
# check default name in list endpoint
t GET networks 200 \
.[].Name~.*bridge.*
# network inspect docker # network inspect docker
t GET networks/$network1_id 200 \ t GET networks/$network1_id 200 \
.Name=network1 \ .Name=network1 \
.Id=$network1_id \ .Id=$network1_id \
.Scope=local .Scope=local
# inspect default bridge network
t GET networks/bridge 200 \
.Name=bridge
# inspect default bridge network with real podman name should return real name
t GET networks/podman 200 \
.Name=podman
# network create docker # network create docker
t POST networks/create Name=net3\ IPAM='{"Config":[]}' 201 t POST networks/create Name=net3\ IPAM='{"Config":[]}' 201
# network delete docker # network delete docker