Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CNI networks: reload networks if needed #11846

Merged
merged 1 commit into from
Oct 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions libpod/network/cni/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1020,28 +1020,6 @@ var _ = Describe("Config", func() {
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("subnet 10.10.0.0/24 is already used on the host or by another config"))
})

It("remove network should not error when config file does not exists on disk", func() {
name := "mynet"
network := types.Network{Name: name}
_, err := libpodNet.NetworkCreate(network)
Expect(err).To(BeNil())

path := filepath.Join(cniConfDir, name+".conflist")
Expect(path).To(BeARegularFile())

err = os.Remove(path)
Expect(err).To(BeNil())
Expect(path).ToNot(BeARegularFile())

err = libpodNet.NetworkRemove(name)
Expect(err).To(BeNil())

nets, err := libpodNet.NetworkList()
Expect(err).To(BeNil())
Expect(nets).To(HaveLen(1))
Expect(nets).ToNot(ContainElement(HaveNetworkName(name)))
})
})

Context("network load valid existing ones", func() {
Expand Down
22 changes: 19 additions & 3 deletions libpod/network/cni/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net"
"os"
"strings"
"time"

"github.com/containernetworking/cni/libcni"
"github.com/containers/podman/v3/libpod/define"
Expand Down Expand Up @@ -40,6 +41,9 @@ type cniNetwork struct {
// lock is a internal lock for critical operations
lock lockfile.Locker

// modTime is the timestamp when the config dir was modified
modTime time.Time

// networks is a map with loaded networks, the key is the network name
networks map[string]*network
}
Expand Down Expand Up @@ -113,10 +117,22 @@ func (n *cniNetwork) Drivers() []string {
}

func (n *cniNetwork) loadNetworks() error {
// skip loading networks if they are already loaded
if n.networks != nil {
// check the mod time of the config dir
f, err := os.Stat(n.cniConfigDir)
if err != nil {
return err
}
modTime := f.ModTime()

// skip loading networks if they are already loaded and
// if the config dir was not modified since the last call
if n.networks != nil && modTime.Equal(n.modTime) {
return nil
}
// make sure the remove all networks before we reload them
n.networks = nil
n.modTime = modTime

// FIXME: do we have to support other file types as well, e.g. .conf?
files, err := libcni.ConfFiles(n.cniConfigDir, []string{".conflist"})
if err != nil {
Expand Down Expand Up @@ -153,7 +169,7 @@ func (n *cniNetwork) loadNetworks() error {
logrus.Errorf("CNI config list %s could not be converted to a libpod config, skipping: %v", file, err)
continue
}
logrus.Tracef("Successfully loaded network %s: %v", net.Name, net)
logrus.Debugf("Successfully loaded network %s: %v", net.Name, net)
networkInfo := network{
filename: file,
cniNet: conf,
Expand Down
3 changes: 1 addition & 2 deletions libpod/runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -489,8 +489,7 @@ func makeRuntime(ctx context.Context, runtime *Runtime) (retErr error) {
DefaultNetwork: runtime.config.Network.DefaultNetwork,
DefaultSubnet: runtime.config.Network.DefaultSubnet,
IsMachine: runtime.config.Engine.MachineEnabled,
// TODO use cni.lock
LockFile: filepath.Join(runtime.config.Network.NetworkConfigDir, "cni1.lock"),
LockFile: filepath.Join(runtime.config.Network.NetworkConfigDir, "cni.lock"),
})
if err != nil {
return errors.Wrapf(err, "could not create network interface")
Expand Down
4 changes: 2 additions & 2 deletions test/apiv2/35-networks.at
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,8 @@ t DELETE libpod/networks/network2 200 \
.[0].Err=null

# test until filter - libpod api
t POST libpod/networks/create name='"network5"' labels='{"xyz":""}' 200 \
.name=network5
# create network via cli to test that the server can use it
podman network create --label xyz network5

# with date way back in the past, network should not be deleted
t POST libpod/networks/prune?filters='{"until":["500000"]}' 200
Expand Down