diff --git a/libpod/networking_common.go b/libpod/networking_common.go index a7c388a5dd..c6f4390c44 100644 --- a/libpod/networking_common.go +++ b/libpod/networking_common.go @@ -530,7 +530,7 @@ func (c *Container) NetworkConnect(nameOrID, netName string, netOpts types.PerNe if err := c.runtime.state.NetworkConnect(c, netName, netOpts); err != nil { // Docker compat: treat requests to attach already attached networks as a no-op, ignoring opts - if errors.Is(err, define.ErrNetworkConnected) && c.ensureState(define.ContainerStateConfigured) { + if errors.Is(err, define.ErrNetworkConnected) && !c.ensureState(define.ContainerStateRunning, define.ContainerStateCreated) { return nil } diff --git a/pkg/api/handlers/compat/networks.go b/pkg/api/handlers/compat/networks.go index 22451adf3a..d205a327f6 100644 --- a/pkg/api/handlers/compat/networks.go +++ b/pkg/api/handlers/compat/networks.go @@ -448,6 +448,10 @@ func Connect(w http.ResponseWriter, r *http.Request) { utils.Error(w, http.StatusNotFound, err) return } + if errors.Is(err, define.ErrNetworkConnected) { + utils.Error(w, http.StatusForbidden, err) + return + } utils.Error(w, http.StatusInternalServerError, err) return } diff --git a/test/apiv2/35-networks.at b/test/apiv2/35-networks.at index dfa5b583b7..2d76a61e5e 100644 --- a/test/apiv2/35-networks.at +++ b/test/apiv2/35-networks.at @@ -218,4 +218,26 @@ t GET networks/$nid 200 .Name="network5" \ # clean the network podman network rm -f network5 +# +# Test connecting container to network when connection already exists +# +podman network create netcon +podman create --network bridge --name c1 $IMAGE top + +# connect c1 to the network for the first time. +t POST networks/netcon/connect Container=c1 200 OK +# connect c1 to netcon again should not error +t POST networks/netcon/connect Container=c1 200 OK + +# connect c1 to netcon here should error as the container is running and it is already connected +podman start c1 +t POST networks/netcon/connect Container=c1 403 .cause="network is already connected" + +# connect c1 to netcon here should not error as container was stopped +podman stop c1 +t POST networks/netcon/connect Container=c1 200 OK + +# cleanup +podman network rm -f netcon + # vim: filetype=sh